Re: C++11: Синхронизация - Условные переменные и ложные проб
От: kotalex  
Дата: 13.03.19 08:42
Оценка: 33 (6) -2
Здравствуйте, rsdn_179b, Вы писали:

Интересует собственно сабж — откуда берутся эти самые "ложные пробуждения" ?

Для POSIX: дело в устройстве самого механизма. Pthread основан на futex. В основе futex идёт (первым аргументом) адрес некоторой переменной (назовём её 'A' в некотором "подопытном" процессе). Далее внутри реализации происходит преобразование адреса переменной из "пользовательского пространства" в физический адрес (это нужно для shared операций между процессами). Далее, от полученного адреса вычисляется 32 битный хэш (так называемый jhash2). Затем вычисляется индекс: от полученного значения берётся маска, что-то типа ( hash & ((1<<20) — 1 ) ). Значение этой маски сильно зависит от системы (настроек, количества процессоров), но обычно она не превышает 1 МБ. Полученный индекс используется для индексации в глобальной таблице, описывающей все futex-объекты. В итоге, если есть в системе какой-либо другой процесс, у которого есть своя переменная 'B' и индекс, подсчитанный от этой переменной совпадёт с индексом переменной 'A' и "выставится событие" по переменой 'B' — то выставится это-же событие и для переменной 'A', т.е. для неё ('A') произойдёт "ложное пробуждение". Вероятность данного явления небольшая, но всё-же есть.
Отредактировано 13.03.2019 9:44 kotalex . Предыдущая версия . Еще …
Отредактировано 13.03.2019 9:38 kotalex . Предыдущая версия .
Отредактировано 13.03.2019 9:36 kotalex . Предыдущая версия .
Отредактировано 13.03.2019 9:34 kotalex . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.