|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Что под капотом у std::mutex ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 22:16 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Загляни в соответствующий заголовок. Внезапно, там системный мутекс. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 22:23 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Там я вижу pthread_mutex_t ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 22:25 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
ЧиТД. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 23:55 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
indigodye0 Что под капотом у std::mutex ? Главное, чтобы мьютекс имел описанные в стандарте свойства. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 10:07 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
indigodye0 Там я вижу pthread_mutex_t ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 10:09 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
А что у .shared_lock() под капотом - стоит ли его юзать для multiple read/single write? что скажете про pthread_rwlock* - они только для C ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 12:25 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик, shared lock, rwlock - это все под капотом имеет обычный мьютекс со счетчиком. Имеет смысл только при наличии медленных ридеров которые блокируют по чтению надолго. Если же ридеры быстрые и долго блокировку не держат, то имеет смысл использовать обычный мьютекс, т.к. у него меньше оверхед. Но конечно надо замерять в каждом конкретном случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 13:29 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, а зачем вообще на чтение блокировать? ну если там не неск.секунд запись, а просто кинул в память и всё... в этот момент чтение опасно? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 15:54 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик а зачем вообще на чтение блокировать? Чтобы никто не писал пока читаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 16:00 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
а как лучше блокировать, когда, например, в одном запросе пишут, а в другом читают? 1. заблокировать весь пишущий запрос 2. заблокировать в пишущем запросе все пишущие ф-и (т.е. вручную каждую отблочить) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 17:50 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Если читателей много а писателей мало или они редко делают операции - то можно попробовать optimistic lock with timestamp. Я никогда не использовал это в С++. Только в Java. Но если получится - то есть шанс сильно облегчить нагрузку на mutex заменив ее атомарными операциями над timestamp. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 18:16 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
а там случайно нет такого инструмента, который можно 1 раз повесить на переменную, чтобы она автоматом блокировалась, когда в неё пишут? Т.е. просто перечислить все переменные и пусть блочит их автоматом всегда, самым оптимистичным образом... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 18:49 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Я думаю - нивелируется смысл мультипоточки. И кроме того старик Амдал топит за то чтобы мы как можно меньше создавали таких мест в коде. Кстати что в ней? Переменной? Счетчик? Можно атомик сделать. А если на этот счетчик смотрит человек (для статистики) то зачем ему видеть каждое обновление? Пускай каждый поток аккумулирует хотя-бы штук 10 итераций - потом сбрасывает изменения. Вобщем тут... с хитростью надо подойти. Тогда и будет перформанс. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 19:24 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
переменные разные, от цифры до строки mayton Пускай каждый поток аккумулирует, хотя-бы штук 10 итераций, потом сбрасывает изменения. а это как? Поток просто выполнил свой запрос, запустил нужные ф-и, и отключился... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 19:43 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик переменные разные, от цифры до строки mayton Пускай каждый поток аккумулирует, хотя-бы штук 10 итераций, потом сбрасывает изменения. а это как? Поток просто выполнил свой запрос, запустил нужные ф-и, и отключился... А... ну здесь нет highload. Так что можешь спокойно мутксы использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 20:05 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
ну запросов то может быть много в секунду... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 20:10 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Ну... сколько? 10? 100? Тут я думаю метрика будет такая. Как только все профилировщики показывают что все потоки ждут этот mutex - вот тогда и наступает highload. А до этого - можно не беспокоиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 20:18 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
там может быть всплеск, вплоть до миллионов можно же умышленно нагрузить запись ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 20:24 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик, Давай макет сюда. С мутексом. Чорт с тобой. Уламал ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 21:52 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
я ещё размышляю о том mutex или не mutex... ну есть 2 направления: чтение и запись в чтении ф-и для чтения в записи ф-и для записи их может быть много... запросов может быть много... за один запрос может быть затронуто несколько ф-й вопрос в том, как блокировать: бабушкин зайчик 1. заблокировать весь пишущий запрос 2. заблокировать в пишущем запросе все пишущие ф-и (т.е. вручную каждую отблочить) и как быть с чтением во время записи? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 22:01 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик и как быть с чтением во время записи? Для того и блокируют, чтобы во время записи никто не мог читать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 22:26 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima T бабушкин зайчик и как быть с чтением во время записи? Для того и блокируют, чтобы во время записи никто не мог читать. это только mutex делает или любая блокировка? разве нет раздельных блокировок на запись и чтение? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 22:30 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик там может быть всплеск, вплоть до миллионов можно же умышленно нагрузить запись ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 03:50 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Не очень я понимаю ваших страданий ... Если счётчик меняется "вне нашего контроля", то на него вешается volatile, чтобы компилятор не больно умничал. Дальше есть два варианта: 1. Требуется "просто консистентное чтение"; 2. Требуется, чтобы "счётчик не менялся ещё несколько операций после чтения". Первое гарантируется аппаратурой, если переменная "не слишком велика". Найти сейчас неатомарный int возможно, но это - нетривиальная задача. Даже long, в основном - уже атомарный. А второе из исходной постановки - как-то не очень просматривается. И вот из этого когнитивного диссонанса "рождается секрет" вопрос: с чем боремся-то? И второй вопрос из того же диссонанса: если вторая задача, то зачем узнавать подкапотные подробности стандартных вещей вопросами на форуме вместо чтения документации? Или, всё-таки, профессионалы видят что-то такое, что недоступно понимаю тупых дилетантов? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 05:04 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик Dima T пропущено... Для того и блокируют, чтобы во время записи никто не мог читать. это только mutex делает или любая блокировка? Любая, но мутекс в т.ч. для этих целей изобрели. бабушкин зайчик разве нет раздельных блокировок на запись и чтение? Ты принципов потокобезопасности похоже не понимаешь. Допустим есть табло, на нем написано слово ПАПА, писатель начинает побуквенно менять на слово ЖОРА, две буквы сменил, отвернулся третью взять, а тут читатель решил прочитать. Догадался что он прочитает ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 07:13 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик я ещё размышляю о том mutex или не mutex... вполне можно и обойтись)) - пишите код в одном потоке. Не переживайте, компьютер успеет)) - не расшаривайте один ресурс на несколько потоков сразу - дробите или копируйте ресурс - "высокий параллелизм - это компромиссы" авторТак чем же придется пожертвовать при использовании стратегии высокого параллелизма? В зависимости от дизайна приложения, вам, возможно, придется выполнять операции чтения вне транзакций, даже когда операция чтения выполняется в целях изменения данных. «Минуточку!» – скажете вы: «Так нельзя – это может кончиться изменением данных, которые уже были изменены после их чтения!» Это правильное замечание, и заодно – это точка старта игры в компромиссы. При этой стратегии, поскольку вы не удерживаете блокировок данных на чтение, шансы на получение исключений, говорящих об устаревших данных, при операциях обновления увеличивается. Однако, как и в случае корабля Vasa, придется выбирать, какие характеристики важнее: надежная, пуленепробиваемая транзакционная стратегия (типа стратегии слоя API) или высокий параллелизм и пропускная способность. В ситуациях с большим количеством параллельных обращений очень трудно обеспечить и то, и другое, а если попытаться достичь этого, может оказаться, что приложение не делает хорошо ни того, ни другого. http://www.k-press.ru/cs/2009/3/ts/ts.asp ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 10:38 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima T Ты принципов потокобезопасности похоже не понимаешь. Допустим есть табло, на нем написано слово ПАПА, писатель начинает побуквенно менять на слово ЖОРА, две буквы сменил, отвернулся третью взять, а тут читатель решил прочитать. Догадался что он прочитает ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 10:42 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
rdb_dev, "Для того чтобы судить о качестве приготовленной яичницы - необязательно уметь нести яйца" (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 10:54 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
rdb_dev Dima T Ты принципов потокобезопасности похоже не понимаешь. Допустим есть табло, на нем написано слово ПАПА, писатель начинает побуквенно менять на слово ЖОРА, две буквы сменил, отвернулся третью взять, а тут читатель решил прочитать. Догадался что он прочитает ? Недавно смотрел доклад одного господина про Erlang и perfomance. И он упоминал о том что даже atomic (CAS) зависит от количества ядер (кешей). Грубо говоря ты докидываешь в железо больше параллелизма, покупаешь 4 процессора по 16 и 24 ядер а работа CAS при этом не улучшается а ухудшается за счет необходимости проверять большее число физических устройств кешей чтобы гарантировать проверку-установку. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 11:27 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
PetroNotC Sharp rdb_dev, "Для того чтобы судить о качестве приготовленной яичницы - необязательно уметь нести яйца" (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 12:12 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima T бабушкин зайчик разве нет раздельных блокировок на запись и чтение? Ты принципов потокобезопасности похоже не понимаешь. Допустим есть табло, на нем написано слово ПАПА, писатель начинает побуквенно менять на слово ЖОРА, две буквы сменил, отвернулся третью взять, а тут читатель решил прочитать. Догадался что он прочитает ? data race, race condition, false sharing... Кое-что понимаю. DimaTВсе классы-контейнеры из std:: НЕпотокобезопасные, поэтому при многопоточной работе с ними надо дополнительно прописывать синхронизацию доступа. Это сложно... А если просто под mutex засунуть запись в такой контейнер, то никто не сможет из него читать. Говорят, корутины решают все проблемы асинхронности и НЕблокирующей синхронизации? rdb_dev Чтобы понимать принципы потокобезопасности, надо иметь представление о когерентности кэша процессора и атомарных инструкций процессора работы с памятью на целевой платформе. L1 обычно НЕ шарится, L2 шарится на 2 ядра, L3 шарится на 4... Кое-что понимаю. PetroNotC Sharp - пишите код в одном потоке. Не переживайте, компьютер успеет)) никогда он не успеет столько же прочитать, как в 20 потоков PetroNotC Sharp - не расшаривайте один ресурс на несколько потоков сразу И как тогда читать в несколько потоков? PetroNotC Sharp - дробите или копируйте ресурс и что получится? В одном потоке будут писать в один ресурс, в другом читать из других ресурсов... А дальше что? А смысл? А блокировка чем хуже? mayton Недавно смотрел доклад одного господина про Erlang и perfomance. И он упоминал о том что даже atomic (CAS) зависит от количества ядер (кешей). Грубо говоря ты докидываешь в железо больше параллелизма, покупаешь 4 процессора по 16 и 24 ядер а работа CAS при этом не улучшается а ухудшается за счет необходимости проверять большее число физических устройств кешей чтобы гарантировать проверку-установку. Говорят, что каждому потоку надо выделять отдельный проц (или даже на процессы побить и кидать запросы в пул)... По мне так это самое идеальное для сегодняшнего железа. Другой вариант - микросервисы, где каждому сервису - свой компьютер. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 12:20 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
mayton, влияет не столько увеличение количества ядер, сколько увеличение количества DSM/NUMA узлов - процессорных юнитов, потому как взаимодействие между ядром одного процессора с памятью, адресуемой другим процессором, происходит по специальному MESI протоколу, например Intel QuickPath, который является "бутылочным горлышком". ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 12:25 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик rdb_dev Чтобы понимать принципы потокобезопасности, надо иметь представление о когерентности кэша процессора и атомарных инструкций процессора работы с памятью на целевой платформе. L1 обычно НЕ шарится, L2 шарится на 2 ядра, L3 шарится на 4... Кое-что понимаю. Нужно понимать, что такое cacheline, как они работают и как работают атомарные инструкции работы с ОЗУ, к примеру, такие как "xchg" или "lock cmpxchg". ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 12:29 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
rdb_dev, кстати, недавно проскакивала смежная тема 22370268 . ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 12:40 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
rdb_dev mayton, влияет не столько увеличение количества ядер, сколько увеличение количества DSM/NUMA узлов - процессорных юнитов, потому как взаимодействие между ядром одного процессора с памятью, адресуемой другим процессором, происходит по специальному MESI протоколу, например Intel QuickPath, который является "бутылочным горлышком". Тогда надо кластеризовать процесcы вокруг узлов. Тоесть брать "ручное управление" вместо планировщика. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 12:41 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик DimaTВсе классы-контейнеры из std:: НЕпотокобезопасные, поэтому при многопоточной работе с ними надо дополнительно прописывать синхронизацию доступа. Это сложно... А если просто под mutex засунуть запись в такой контейнер, то никто не сможет из него читать. Надо засовывать под мьютекс или другую блокировку. И не только запись, а любое обращение к контейнеру. Чудес не бывает. Чтобы могли читать - пишуший не должен блокировать навечно, только минимально необходимое для записи, в остальное время читатели пусть читают. бабушкин зайчик Говорят, корутины решают все проблемы асинхронности и НЕблокирующей синхронизации? Кто говорит? Неблокирующая синхронизация строится на атомарных операциях. Есть потокобезопасные контейнеры построенные на этих принципах, но к std:: это не относится. Можешь почитать разработчика таких контейнеров https://habr.com/ru/users/khizmax/posts/ По сути неблокирующая синхронизация все равно блокирующая, только на уровне проца. Одно ядро запрещает другим читать некоторый участок памяти и производит его изменение, если в этот момент другие ядра попытаются туда писать/читать, то будут приостановлены до завершения работы ядра захватившего память. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 12:43 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик Говорят, корутины решают все проблемы асинхронности и НЕблокирующей синхронизации? Корутин - это просто функция с состоянием которую можно много раз вызывать. И все. Сам по себе корутин ничего не решает. Решает наверное архитектура акторов которые по смыслу - корутины читающие очередь сообщений. Но мне кажется что в этом топике - уж слишком контр-продуктивно перескакивать на эту тему. Это знаетели... начали пить за здравие - и закончили "за упокой души". Уж лучше останемся в рамках мьютекса или критической секции. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 12:50 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик никогда он не успеет столько же прочитать, как в 20 потоков Ну прочитал Войну и Мир за 3 сек. А дальше то что? Горд очень этим? Бизнесу не надо читать на скорость (с) бабушкин зайчик и что получится? В одном потоке будут писать в один ресурс, в другом читать из других ресурсов... А дальше что? А смысл? А блокировка чем хуже? Статью мою по ссылке про ПАРАЛЛЕЛИЗМ прочитал? К компромиссам готов? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 12:55 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик, блокировки в веб проектах это плохой стиль архитектуры. Верить или нет - твоё дело. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 12:59 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
PetroNotC Sharpблокировки в веб проектах это плохой стиль архитектуры. Уэб-проекты сами по себе это квинтэссенция плохой архитектуры, блокировками их уже не испортишь. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:12 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima T Надо засовывать под мьютекс или другую блокировку. И не только запись, а любое обращение к контейнеру. Чудес не бывает. А зачем любое? Если поток читает, а в этот момент другой пишет И блокирует, то первый же не сможет читать? Он будет перечитывать после разблокировки или что произойдёт? mayton Корутин - это просто функция с состоянием которую можно много раз вызывать. И все. так это обычная ф-я со static внутри ? итого, на опыте, как задачу то решать? бабушкин зайчик я ещё размышляю о том mutex или не mutex... ну есть 2 направления: чтение и запись в чтении ф-и для чтения в записи ф-и для записи их может быть много... запросов может быть много... за один запрос может быть затронуто несколько ф-й вопрос в том, как блокировать: бабушкин зайчик 1. заблокировать весь пишущий запрос 2. заблокировать в пишущем запросе все пишущие ф-и (т.е. вручную каждую отблочить) и как быть с чтением во время записи? вообще не блокировать и всё в один поток? корутинами? блокировать куски контейнера во время записи? выдать каждому контейнеру по микросервису и отдельный процесс? (так то записи будет гораздо меньше, чем чтения, но запись ведь всегда можно нагрузить вручную...) PetroNotC Sharp Бизнесу не надо читать на скорость (с) ну да, бизнесу надо, чтобы всё висело, а клиент ждал каждую операцию 10+ секунд ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:15 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
rdb_dev бабушкин зайчик пропущено... L1 обычно НЕ шарится, L2 шарится на 2 ядра, L3 шарится на 4... Кое-что понимаю. Нужно понимать, что такое cacheline, как они работают и как работают атомарные инструкции работы с ОЗУ, к примеру, такие как "xchg" или "lock cmpxchg". авторПри написании программы, которой требуется частый доступ к данным или их части, стоит помнить, что производительность будет выше, если запрашиваемые данные помещаются в cache-line — блок памяти, целиком читаемый процессором при доступе к адресу в нем. На 64-битной машине он обычно занимает 64 байта, на других платформах — обычно 32 байта. Группировка связанных данных не только улучшает читаемость, но и способствует локализации данных в кэше. Это дополнительная причина реорганизовывать структуры с учетом особенностей доступа к данным в вашей программе. Если в вашем коде есть конкурентный (concurrent) доступ к данным, появляется третья проблема: «cache line bouncing». Для минимизации трафика в шине следует располагать данные так, чтобы чтение из одного кэша и запись в другой производились с меньшим промежутком. Да, это противоречит предыдущему замечанию, однако многопоточный код — это всегда сложно. Оптимизация многопоточного кода — тема, заслуживающая отдельной большой статьи. Все, что я могу здесь сказать, такая проблема существует. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:22 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
mayton Тогда надо кластеризовать процесcы вокруг узлов. Тоесть брать "ручное управление" вместо планировщика. Поэтому операционки, как правило, выкидывают с user-space соответствующие функции API, позволяющие получать информацию о кол-ве ядер, процессоров и NUMA узлов, а также задавать предпочтительный логический процессор (ядро). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:23 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик Dima T Надо засовывать под мьютекс или другую блокировку. И не только запись, а любое обращение к контейнеру. Чудес не бывает. А зачем любое? Если поток читает, а в этот момент другой пишет И блокирует, то первый же не сможет читать? Он будет перечитывать после разблокировки или что произойдёт? Сначала читатель дочитывает, писатель в это время ожидает блокировки, когда читатель дочитал, писатель блокирует и пишет, читатель при необходимости прочитать ждет пока писатель закончит. В один момент времени с контейнером работает только один поток, если в этот момент другой поток хочет обратиться к контейнеру, то он останавливается и ждет пока первый закончит и снимет блокировку. Ты вроде написал что понял о чем речь 22388567 , но похоже что нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:26 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик, уже лучше! Осталось только ознакомиться с работой инструкций: prefetch, clflush, mfence, sfence и lfence :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:27 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima TТы вроде написал что понял о чем речь, но похоже что нет. А уж что будет когда он доберётся до множественных читателей, которым хочется разрешить читать одновременно... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:30 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик ну да, бизнесу надо, чтобы всё висело, а клиент ждал каждую операцию 10+ секунд - поток с ГУИ без длительных операций. Теперь скажи - как чтение Война и Мир за 3 сек в доп потоке потребовали блокировки? )))) Какие то студенческие ТЗ для размышлений. Нам надо вас уговаривать на блокировки? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:30 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
rdb_dev Иными словами - не обязательно изучать микросхематехнику и проектировать процессоры? :) Достаточно понимать про "атомарность" и "изменчивость" ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:36 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima T бабушкин зайчик пропущено... А зачем любое? Если поток читает, а в этот момент другой пишет И блокирует, то первый же не сможет читать? Он будет перечитывать после разблокировки или что произойдёт? Сначала читатель дочитывает, писатель в это время ожидает блокировки, когда читатель дочитал, писатель блокирует и пишет, читатель при необходимости прочитать ждет пока писатель закончит. В один момент времени с контейнером работает только один поток, если в этот момент другой поток хочет обратиться к контейнеру, то он останавливается и ждет пока первый закончит и снимет блокировку. Ты вроде написал что понял о чем речь 22388567 , но похоже что нет. дело в том, что везде пишут про блокировки на запись... а чтение блокировать якобы НЕ надо (в т.ч. и мультичтение вообще блокировать НЕ надо) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:38 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик никогда он не успеет столько же прочитать, как в 20 потоков ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:38 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, для этих целей в стандарте у экземпляров std::atomic есть метод load() с порядком доступа acquire. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:39 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Необязательно даже знать о кэш-строках и протоколах когерентности. Достаточно понимать про "атомарность" и "изменчивость" ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:41 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
rdb_dev Очень желательно это знать, чтобы правильно выравнивать массивные структуры данных в памяти, к которым необходим конкурентный доступ. Знать о существовании кэшей и протоколов когерентности всё так же не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:46 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик Корутин - это просто функция с состоянием которую можно много раз вызывать. И все. так это обычная ф-я со static внутри ? итого, на опыте, как задачу то решать? Не обязательно. Корутина (со-программа) - это такой-себе хай-левел шаблон. Никто не обязывает нас делать ее функцией со статик. Можно ее сделать классом. Итератор например можно тоже считать ко-рутиной. Я знаю что Boost содержит поддержку корутин но я никогда не пользовался. Есть языки программирование где есть поддержка yield return. На них можно удобнее реализовывать такие функции. И я не знаю как решать твою задачу. Ведь ты ее толком нигде не озвучил. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:47 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
mayton Есть языки программирование где есть поддержка yield return. C++20, например mayton И я не знаю как решать твою задачу. Ведь ты ее толком нигде не озвучил. это наверное самая частая отмазка здесь многопоточно писать/читать контейнер с минимальными блокировками - чем не задача? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:49 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Dima TТы вроде написал что понял о чем речь, но похоже что нет. А уж что будет когда он доберётся до множественных читателей, которым хочется разрешить читать одновременно... Можно еще версионность обсудить. Обычно когда блокировки не позволяют решать задачу - вводят версионность. Даже для коллекций. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:52 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик дело в том, что везде пишут про блокировки на запись... а чтение блокировать якобы НЕ надо (в т.ч. и мультичтение вообще блокировать НЕ надо) автор if all readers then no locks required. if the number of reads is much larger than the number of writes - we might be able to use a readers/writer lock (std::shared_mutex) if most operations are writes, then per-element mutex strategy might work, если там запись на ровно 1 элемент но ты утверждаешь, что прям любое обращение к контейнеру надо блочить... Похоже ты сам не понимаешь то что процитировал. Если красное ты понял что всегда читать можно без блокировки, то это неверно. Читать можно без блокировки если никто не пишет, вообще никогда не пишет. Т.е. контейнер однажды заполнили и отдали потокам с обещанием что больше туда ничего не будет записано. бабушкин зайчик что же будет при мультичтении... Зеленым выделил, это как раз тот случай когда один писатель и много читателей. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:54 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
mayton И я не знаю как решать твою задачу. Ведь ты ее толком нигде не озвучил. ))) бабушкин зайчик это наверное самая частая отмазка здесь... многопоточно писать/читать контейнер - чем не задача? ну дак выдели ЧАСТЬ кода для блокировки. Рукописный контейнер полностью с нуля? Описание требований к контейнеру где? Что внутри контейнера? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:54 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Кто что думает про https://github.com/STEllAR-GROUP/hpx ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:55 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик многопоточно писать/читать контейнер с минимальными блокировками - чем не задача? авторНе бывает абстрактных сферических thread safe контейнеров в вакууме. И не может быть. Тех, кто употребляет такое слово применительно к контейнерам вообще, нужно нещадно бить батогами и ссылать в Сибирь )) https://rsdn.org/forum/cpp/5342417.all ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 13:58 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик это наверное самая частая отмазка здесь многопоточно писать/читать контейнер с минимальными блокировками - чем не задача? Вообще - не задача. На Stackoverflow такие вопросы модераторы сразу закрывают. Нет конкретики. Нет понятного применения. Сферические бенчмарки в вакууме чреваты тем что у всех будут разные результаты во первых. А во вторых эффективность решения будет зависеть от многих параметров. Например от пропорции читателей и писателей. И от того как долго писатель удерживает контейнер. И может быть даже от того какова вероятность столкнуться двум потокам в мониторе. И может быть от того сколько процессоров и ядер у тебя и сколько структур данных лежит в кешлиниях. И корутины тут пока непричем потому что у тебя не акторная архитектура а просто основанная на синхронности и конкуренции. Акторы - это про другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 14:03 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик mayton Есть языки программирование где есть поддержка yield return. C++20, например mayton И я не знаю как решать твою задачу. Ведь ты ее толком нигде не озвучил. это наверное самая частая отмазка здесь многопоточно писать/читать контейнер с минимальными блокировками - чем не задача? Если один контейнер заменить на десять, то вероятность того что нужный контейнер свободен увеличится в десять раз. Мало на 10 - дели на 100 и т.д. А вот можно ли заменить один на десять - это зависит от решаемой задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 14:05 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima T Похоже ты сам не понимаешь то что процитировал. ну найди там где-то утверждение, что надо блочить чтение там про это вообще ни слова автор- exactly one thread may update an element at any given time - no other thread may read an element while the write is updating it - more than one thread may read an element when no updates is in progress Dima T Если один контейнер заменить на десять, то вероятность того что нужный контейнер свободен увеличится в десять раз. Мало на 10 - дели на 100 и т.д. блокировать зоопарк контейнеров по одному - это лучше, чем отдельная блокировка пишущих ячеек в одном контейнере? PetroNotC Sharp бабушкин зайчик многопоточно писать/читать контейнер с минимальными блокировками - чем не задача? авторНе бывает абстрактных сферических thread safe контейнеров в вакууме. И не может быть. Тех, кто употребляет такое слово применительно к контейнерам вообще, нужно нещадно бить батогами и ссылать в Сибирь )) и что он имел ввиду под авторКстати, если "лочить-разлочить" настолько большая проблема, что аж "надоело", то не пора ли пересматривать архитектуру ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 14:22 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик Dima T Похоже ты сам не понимаешь то что процитировал. ну найди там где-то утверждение, что надо блочить чтение там про это вообще ни слова автор- exactly one thread may update an element at any given time - no other thread may read an element while the write is updating it - more than one thread may read an element when no updates is in progress Красным выделил что надо блочить чтение на время записи бабушкин зайчик Dima T Если один контейнер заменить на десять, то вероятность того что нужный контейнер свободен увеличится в десять раз. Мало на 10 - дели на 100 и т.д. блокировать зоопарк контейнеров по одному - это лучше, чем отдельная блокировка пишущих ячеек в одном контейнере? Так будет работать быстрее и лучше распараллеливаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 14:29 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик блокировать зоопарк контейнеров по одному - это лучше, чем отдельная блокировка пишущих ячеек в одном контейнере? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 14:35 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик и что он имел ввиду под авторКстати, если "лочить-разлочить" настолько большая проблема, что аж "надоело", то не пора ли пересматривать архитектуру ? 22388622 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 14:39 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик, по кругу ходим. Ты везде не прав (( ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 14:40 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima T бабушкин зайчик пропущено... ну найди там где-то утверждение, что надо блочить чтение там про это вообще ни слова - no other thread may read an element while the write is updating it Красным выделил что надо блочить чтение на время записи Здесь написано, что во время записи надо блокировать элемент, чтобы его никто прочитать не смог. Dima T бабушкин зайчик пропущено... блокировать зоопарк контейнеров по одному - это лучше, чем отдельная блокировка пишущих ячеек в одном контейнере? Так будет работать быстрее и лучше распараллеливаться. может быть на операциях записи... а как быть с операциями сортировки, группировки, джойнов и т.д. ? PetroNotC Sharp бабушкин зайчик, по кругу ходим. Ты везде не прав (( ну так сходи в другую тему. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 14:51 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
mayton Тебе надо писать только в матрицу С. ну и где проблема то? создал матрицу C внутри ф-и, сложил туда A и B и вернул если в этот момент в эти A/B -матрицы может идти запись, то заблочить + скопировать их внутрь ф-и (это же быстрее, чем блочить их на всё время перемножения) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:07 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Напиши код. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:09 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
mayton, ты когда задачу ставил, сам то её писал? Если да, то просто скажи, где там камень. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:10 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Коллеги, причем тут std::mutex ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:13 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Ну... самый первый камень - это как распараллелить. Особенно с учотом того что доступ к матрице Б идет неблагоприятным образом. Вертикальное сканирование double элементов - создает крайне неудачную игру с кешом. Какие будут предложения? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:16 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
indigodye0 Коллеги, причем тут std::mutex ? Да. Прошу прощения что мы тут нафлудили. Если мешает - я создам отдельный тред под умножение матриц. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:16 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
mayton indigodye0 Коллеги, причем тут std::mutex ? Да. Прошу прощения что мы тут нафлудили. Если мешает - я создам отдельный тред под умножение матриц. Буду признателен ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:17 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
По теме матриц - прошу всех сюда Ускорить умножение квадратных матриц (продолжение темы с mutex) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:22 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
mayton По теме матриц - прошу всех сюда Ускорить умножение квадратных матриц (продолжение темы с mutex) Спасибо ! ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:22 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
indigodye0Частые смены контекста потоков - приводят к частым инвалидациями кешей К счастью их частота быстро падает с увеличением количества процессорных ядер (а создавать больше потоков чем ядер не имеет смысла), а в поставленной задаче с кэшем проблемы только у С. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:26 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик Dima T пропущено... Красным выделил что надо блочить чтение на время записи Здесь написано, что во время записи надо блокировать элемент, чтобы его никто прочитать не смог. Если мы продолжаем про std::контейнеры, то в этом случае элемент это контейнер, ты же не знаешь что там внутри меняется при записи, поэтому блокировка доступа целиком к контейнеру. бабушкин зайчик Dima T пропущено... Так будет работать быстрее и лучше распараллеливаться. может быть на операциях записи... а как быть с операциями сортировки, группировки, джойнов и т.д. ? От задачи зависит. Поэтому тебе написали что не бывает универсальных потокобезопасных контейнеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:32 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
А давайте задачу по thread-safe-containers рассмотрим с позиции нескольких процессоров... Если потоки (или даже процессы?) выделять по 1 на процессор, а не на ядро, чтобы исключить косяки кэша (главная проблема, как я понимаю), то что можно из этого выжать? Варианты: - у каждого процессора свой конкретный набор контейнеров, в которые другие не лезут - 1 процессор только пишет, другой только читает - внутри процессора каждый поток работает только со своим куском контейнера (поток1 = 0-9999, поток2 = 10000-19999 и т.д.) - ещё? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:37 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик, хитрец. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 15:42 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик Если потоки (или даже процессы?) выделять по 1 на процессор тут скорее не поток выделять, а задачу... пул процессов, где 1 процесс = 1 процессор приходит задача и получает из пула процесс (возможно даже процессор, отвечающий конкретно за эти задачи) как-то так в микросервисах у каждой задачи свой микросервис но если они на одном сервере, то проблема с кэшами остаётся ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 16:00 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчикто что можно из этого выжать? Ничего. Вывод всё тот же: если вам понадобился контейнер для которого не хватает простой полной сериализации любого доступа, то либо что-то не так с вашей консерваторией, либо задача очень и очень специфична, а потому следует пойти и потренироваться на кошках прежде чем к ней приступать. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 16:04 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик А давайте задачу по thread-safe-containers рассмотрим с позиции нескольких процессоров... Если потоки (или даже процессы?) выделять по 1 на процессор, а не на ядро, чтобы исключить косяки кэша (главная проблема, как я понимаю), то что можно из этого выжать? Проблема нескольких процов точно такая же как проблема нескольких ядер. На переброску данных между процами уходит больше времени, чем между ядрами, вот и вся разница. Если рассуждаем про минимизацию тормозов на синхронизацию доступа к абстрактным данным, то не принципиально один проц многоядерный или несколько. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 16:06 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov простой полной сериализации любого доступа что имеется ввиду? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 16:12 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima T бабушкин зайчик А давайте задачу по thread-safe-containers рассмотрим с позиции нескольких процессоров... Если потоки (или даже процессы?) выделять по 1 на процессор, а не на ядро, чтобы исключить косяки кэша (главная проблема, как я понимаю), то что можно из этого выжать? Проблема нескольких процов точно такая же как проблема нескольких ядер. На переброску данных между процами уходит больше времени, чем между ядрами, вот и вся разница. Если рассуждаем про минимизацию тормозов на синхронизацию доступа к абстрактным данным, то не принципиально один проц многоядерный или несколько. ну чё-то микросервисы это не останавливает... А они ещё медленнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 16:18 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчикчто имеется ввиду? Внезапно: применение сабжа. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 16:19 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
а если в контейнере одни инты, там нужна блокировка? Я имею ввиду, если запись в ячейку с интом, его же нельзя как-то поменять, чтобы кто-то прочитал пол-инта? Или там прям побитово читается/пишется в одной ячейке памяти без блокировки всей ячейки? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 18:41 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Thorn read для int зависит от аппаратуры, как уже сказано выше. Но проблема в том, что из контейнера может исчезнуть сам int. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 18:57 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик>при мультичтении... При "мультичтении" используются, например, https://en.cppreference.com/w/cpp/thread/shared_mutex ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 18:59 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
ну да, про это уже писали Anatoly Moskovsky бабушкин зайчик, shared lock, rwlock - это все под капотом имеет обычный мьютекс со счетчиком. Имеет смысл только при наличии медленных ридеров которые блокируют по чтению надолго. Если же ридеры быстрые и долго блокировку не держат, то имеет смысл использовать обычный мьютекс, т.к. у него меньше оверхед. Но конечно надо замерять в каждом конкретном случае. я слышал, что shared_mutex - самый нежелательный из mutex-ов... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 19:04 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Basil A. Sidorov rdb_dev Очень желательно это знать, чтобы правильно выравнивать массивные структуры данных в памяти, к которым необходим конкурентный доступ. Знать о существовании кэшей и протоколов когерентности всё так же не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 19:05 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик Dima T пропущено...Красным выделил что надо блочить чтение на время записи ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 19:09 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
rdb_dev Достоверно его можно узнать только выполнив инструкцию cpuid. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 19:40 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик а если в контейнере одни инты, там нужна блокировка? Я имею ввиду, если запись в ячейку с интом, его же нельзя как-то поменять, чтобы кто-то прочитал пол-инта? Или там прям побитово читается/пишется в одной ячейке памяти без блокировки всей ячейки? Вот начинает проявляться конкретная задача :) Но в общем случае все-равно нельзя, уточняй задачу. Ты же не говоришь в каком типе контейнера этот инт, как контейнер используется. Может пока ты его меняешь в одном потоке, другой в это время перемещает эту "ячейку" в другое место памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 20:31 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
rdb_dev бабушкин зайчик пропущено... Здесь написано, что во время записи надо блокировать элемент, чтобы его никто прочитать не смог. Такого нет Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 20:39 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик я слышал, что shared_mutex - самый нежелательный из mutex-ов... Да, он сам по себе тормоз, т.к. счетчик читателей гоняется между всех читающих потоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 20:40 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima T Ты же не говоришь в каком типе контейнера этот инт в дефолтном - vector используется по назначению - инты пишутся, инты читаются Dima T Может пока ты его меняешь в одном потоке, другой в это время перемещает эту "ячейку" в другое место памяти. ну ячейка опустеет, в общем-то это же не проблема... или он может читануть между копированием и удалением? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 21:18 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик а если в контейнере одни инты, там нужна блокировка? Я имею ввиду, если запись в ячейку с интом, его же нельзя как-то поменять, чтобы кто-то прочитал пол-инта? Или там прям побитово читается/пишется в одной ячейке памяти без блокировки всей ячейки? В современных архитектурах запись-чтение в сырую память идет блочками по 64 байта. Это - кеш-линия. Также atomic (CAS) будет работать. Только он будет блокировать все копии этой страницы во всех кешах для достижения финала сравнения с обменом. Тоесть очень сомнительно что кто-то прочитает пол-инта. Возможно лет 20 назад это было возможно. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2021, 21:50 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик Dima T Ты же не говоришь в каком типе контейнера этот инт в дефолтном - vector используется по назначению - инты пишутся, инты читаются Dima T Может пока ты его меняешь в одном потоке, другой в это время перемещает эту "ячейку" в другое место памяти. ну ячейка опустеет, в общем-то это же не проблема... или он может читануть между копированием и удалением? Конечно может. Например один поток вставляет элемент, внутри вектора места нет и вектор начинает выделение нового блока памяти и копирование, в этот момент другой поток обращается к элементу v[0] и что-то меняет в нем, но он уже скопирован и эти изменения просто потеряются. В лучшем случае словишь segfault если первый поток успеет память освободить пока второй с ней работает. Даже без копирования можно потерять изменения, т.к. операции с интами не атомарны. Например два потока одновременно прочитали один элемент, поменяли и записали. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 07:29 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Basil A. Sidorov До столба тоже докапываться будем или просто возьмём 64 в качестве магического значения? Пусть будет "магическое 64". В принципе, приемлемо. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 08:51 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima T rdb_dev пропущено...Весь необходимый функционал для реализации этого есть в std::atomic. Код: plaintext 1.
Пользовательский тип в std::atomic должен быть trivially copyable - с конструктором копии по умолчанию. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 08:56 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
mayton Тоесть очень сомнительно что кто-то прочитает пол-инта. Возможно лет 20 назад это было возможно. Уже Intel 8086 с 16-разрядной шиной памяти умел работать с префиксом LOCK и соответствующим ему аппаратным сигналом. Возможно, что и 8080 умел, но "это я уже неотчётливо". ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 10:09 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
вот приходит запрос, ему выделяется поток что делает запрос: лезет в vector clients, а параллельно clients нужно почитать vector contracts, а также users и phones это что - блокировка каждого из этих контейнеров? или блокировка всей операции разом? или с каждым вектором работает свой поток и между ними идёт обмен? или что? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 12:30 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик>или что? То, что реализовал программист. Было у него оранжевое настроение - он сделал так. А если бы было черное - то эдак. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 12:49 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
....а если он хотел чтобы апокалипсис начался прямо сейчас - сделал микросервисы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 12:59 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
а без воды если? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 13:01 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
У тебя вопрос из воды сделан, на него нет сухих ответов. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 13:10 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, а зачем тогда пишешь? ладно бы ещё вопрос уточнял ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 13:12 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик а зачем тогда пишешь? ладно бы ещё вопрос уточнял Чтобы ты понял бесперспективность задавания таких вопросов. А уточнять в нём нечего, он предельно ясен, что не делает его менее жидким. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 13:15 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov бесперспективность задавания таких вопросов тебе то откуда знать? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 13:26 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчиктебе то откуда знать? "Опыт, сын ошибок трудных." (с) С годами приходит понимание, что "есть много способов приготовить кошку" и не все они неправильные. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 13:40 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
слушай, если бы у тебя был опыт в многопоточке, ты бы писал про свой опыт рассказал бы, что не так с этой задачей и как правильно но ты просто льёшь воду и толку от твоего "опыта" даже не 0, а минус по теме сказать нечего, но написать что-то надо... странный ты, взрослый человек. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 13:44 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчикесли бы у тебя был опыт в многопоточке, ты бы писал про свой опыт рассказал бы, что не так с этой задачей и как правильно Ты, походу, читать не умеешь. Выше я уже рассказал и про свой опыт и о том как делать правильно и почему есть более одного "правильно". Или это было в форкнувшемся топике?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 13:59 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик вот приходит запрос, ему выделяется поток что делает запрос: лезет в vector clients, а параллельно clients нужно почитать vector contracts, а также users и phones это что - блокировка каждого из этих контейнеров? или блокировка всей операции разом? или с каждым вектором работает свой поток и между ними идёт обмен? или что? Зайчик - можно я скажу? Я вижу что тут - вообще все не так. Просто в природе нет такой постановки как "вот приходит запрос, ему выделяется поток". Это очень low-level и никто так не программирует. Ну может микроконтроллеры разве что. Приложения пишутся исходя из типового шаблона. Например CGI-приложение. FastCGI. И вот это фреймворк который обрабатывает http-запрос - он уже имеет определенные глобальные объекты. Сесссии. Пулы коннектов. Может быть какие-то объекты уровня запроса-ответа. С коротким life-cycle. Просто если мы не начнём с такого шаблона - то получается что мы пишем Код: plaintext 1.
приложение, а это слишком общо. Мы не сможем просто договориться какие у нас уже есть объекты и как мы работаем напрмер с сокетами. Выделенно. Или мультиплексированно. Какого рода мультзадачность у нас. На процессах. На windows-потоках или не дай бох на всяких posix.... Короче нам еще рано говорить о контейнерах. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 14:08 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик вот приходит запрос, ему выделяется поток что делает запрос: лезет в vector clients, а параллельно clients нужно почитать vector contracts, а также users и phones это что - блокировка каждого из этих контейнеров? или блокировка всей операции разом? или с каждым вектором работает свой поток и между ними идёт обмен? или что? Чем дольше будешь держать блокировку, тем хуже будет параллелиться алгоритм ( Закон Амдала ). Поэтому если хочешь максимальной производительности предусматривай отдельную блокировку для каждого контейнера. И держи ее минимум: заблокировал clients скопировал оттуда что надо, разблокировал, заблокировал contracts и т.д. и т.п. Если данные восновном читаются, то еще быстрее в каждом потоке держать копии контейнеров, и сделать что-то типа репликации, тогда блокировки нужны только для чтения обновления. В общем одного правильного решения нет, надо по конкретную задачу подстраиваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 15:22 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima TВ общем одного правильного решения нет, надо по конкретную задачу подстраиваться. Это я ему уже говорил, он не верит и требует серебряную пулю и прочее "one size fits all". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 15:40 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
mayton Я вижу что тут - вообще все не так. Просто в природе нет такой постановки как "вот приходит запрос, ему выделяется поток". а что есть в природе? Вот приходит запрос... и кто же его принимает? mayton Приложения пишутся исходя из типового шаблона. Например CGI-приложение. FastCGI. И вот это фреймворк который обрабатывает http-запрос - он уже имеет определенные глобальные объекты. Сесссии. Пулы коннектов. Может быть какие-то объекты уровня запроса-ответа. С коротким life-cycle. http-запрос прилетает в FastCGI, который такой же многопоточный, выделяет поток, в котором разбирается запрос, раскладывается по полочкам routing, GET/POST, etc... а на выходе работаем с этими данными... но логика то наша всё равно происходит в каком-то потоке! mayton Мы не сможем просто договориться какие у нас уже есть объекты и как мы работаем например с сокетами. А зачем нам про сокеты договариваться? Это всё взял на себя Nginx и FastCGI (в твоём же примере)... мы уже прошли всю network-стадию и имеем сырьё (детали запроса) для наших логических конструкций. Переходим прямо к контейнерам! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 15:43 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dima T Поэтому если хочешь максимальной производительности предусматривай отдельную блокировку для каждого контейнера. И держи ее минимум: заблокировал clients скопировал оттуда что надо, разблокировал, заблокировал contracts и т.д. и т.п. не даром все базы данных однопоточные... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 15:51 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчикно логика то наша всё равно происходит в каком-то потоке! Да. В потоке. Ровно одном потоке. Который изолирован от остальных и (в идеале) вообще не может с ними никак интерферировать. Поэтому в данной задаче сабж смысла не имеет. Поэтому FastCGI - пример плохой. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 15:54 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov бабушкин зайчикно логика то наша всё равно происходит в каком-то потоке! Да. В потоке. Ровно одном потоке. Который изолирован от остальных и (в идеале) вообще не может с ними никак интерферировать. Поэтому в данной задаче сабж смысла не имеет. Поэтому FastCGI - пример плохой. не понимаю я, что значит "не может интерферировать"... вот этот поток работает с clients, а тут же пришёл ещё 1 запрос и соседний поток так же работает с clients... и оба пишут... и в каком месте тут mutex не имеет смысла? Что тогда имеет смысл? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 16:02 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчик Dima T Поэтому если хочешь максимальной производительности предусматривай отдельную блокировку для каждого контейнера. И держи ее минимум: заблокировал clients скопировал оттуда что надо, разблокировал, заблокировал contracts и т.д. и т.п. не даром все базы данных однопоточные... С чего это вдруг? В полноценных СУБД постраничная блокировка. Если двум запросам не нужна одна и та же страница, то они выполняются параллельно. Там проблемы распараллеливания в другом. В гарантии целостности. Из-за этого приходится долго держать блокировку чтобы гарантировать чтение согласованных данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 16:04 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчикне даром все базы данных однопоточные... А вот в эту тему лучше не лезть, поскольку может выясниться, что таки да, СУБД в основном однопоточные. И чем новее - тем однопоточнее. Даже Джим Старки в последние годы увлёкся NoSQL с полной сериализацией атомарных запросов. (И да, "сериализация" здесь это выстраивание в строгую очередь, а не превращение блока данных в поток.) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 16:06 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчики в каком месте тут mutex не имеет смысла? В любом. HTTP - stateless протокол (и в этом его сила). Как следствие эти FastCGI запросы и их потоки могут вообще выполняться на разных серверах. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 16:09 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov бабушкин зайчики в каком месте тут mutex не имеет смысла? В любом. HTTP - stateless протокол (и в этом его сила). Как следствие эти FastCGI запросы и их потоки могут вообще выполняться на разных серверах. они работают с одной БД... Пишут в одно и тоже место... Я тебе описал реальный пример, как ты его без mutex решать хочешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 16:21 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчикЯ тебе описал реальный пример, как ты его без mutex решать хочешь? Заявлю "это проблема СУБД, не моя" и вообще mutex использовать не буду по причине, описанной выше. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 16:30 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
Друзья. Мне кажется мы ходим по кругу. Пора закруглятся. Давайте еще раз прочитаем сообщения зайчика. А что у .shared_lock() под капотом - стоит ли его юзать для multiple read/single write? что скажете про pthread_rwlock* - они только для C ? Anatoly Moskovsky, а зачем вообще на чтение блокировать? ну если там не неск.секунд запись, а просто кинул в память и всё... в этот момент чтение опасно? а как лучше блокировать, когда, например, в одном запросе пишут, а в другом читают? 1. заблокировать весь пишущий запрос 2. заблокировать в пишущем запросе все пишущие ф-и (т.е. вручную каждую отблочить) И просто подведем итоги. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 16:44 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
ты ни на один из этих вопросов так и не ответил поэтому мне по 5 раз приходится спрашивать, как же правильно с контейнером работать конкурентно наверное максимум инфы я тут от DimaT получил ещё там кто-то что-то прояснял... от тебя только какие-то виляния, которые логично завершаются попыткой закрытия темы. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 16:48 |
|
Что под капотом у std::mutex
|
|||
---|---|---|---|
#18+
бабушкин зайчикпоэтому мне по 5 раз приходится спрашивать, как же правильно с контейнером работать конкурентно Ну ок, раз ты хочешь абсолютного и простого ответа, получи: с контейнером надо работать в эксклюзивном режиме, под мутексом и никак иначе. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 17:32 |
|
|
Start [/forum/topic.php?all=1&fid=57&tid=2017163]: |
0ms |
get settings: |
29ms |
get forum list: |
10ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
210ms |
get topic data: |
26ms |
get forum data: |
3ms |
get page messages: |
2603ms |
get tp. blocked users: |
2ms |
others: | 188ms |
total: | 3081ms |
0 / 0 |