Сообщение Re: C++11: Синхронизация - Условные переменные и ложные проб от 13.03.2019 8:42
Изменено 13.03.2019 9:36 kotalex
Re: C++11: Синхронизация - Условные переменные и ложные проб
Здравствуйте, rsdn_179b, Вы писали:
Для POSIX: дело в устройстве самого механизма. Pthread основан на futex. В основе futex идёт (первым аргументом) адрес некоторой переменной (назовём её 'A'). Далее внутри реализации происходит преобразование адреса переменной из "пользовательского пространства" в физический адресс (это нужно для shared операций между процессами). Далее от полученного адреса вычисляется 32 битный хэш (так называемый jhash2). Затем вычисляется индекс: от полученного значения берётся маска, что-то типа ( hash & ((1<<20) — 1 ) ). Значение этой маски сильно зависит от системы (настроек, количества процессоров), но обычно она не превышает 1 МБ. Полученный индекс используется для индексации в глобальной таблице, описывающей все futex-объекты. В итоге, если есть в системе какой-либо другой процесс у которого есть своя переменная 'B' и индекс, подсчитанный от этой переменной совпадёт с индексом переменной 'A' и "выставится событие" по переменой 'B' — то выставится это-же событие и для переменной 'A', т.е. для неё произойдёт "ложное пробуждение". Вероятность данного явления небольшая, но всё-же есть._>Интересует собственно сабж — откуда берутся эти самые "ложные пробуждения" ?
Re: C++11: Синхронизация - Условные переменные и ложные проб
Здравствуйте, rsdn_179b, Вы писали:
Для POSIX: дело в устройстве самого механизма. Pthread основан на futex. В основе futex идёт (первым аргументом) адрес некоторой переменной (назовём её 'A'). Далее внутри реализации происходит преобразование адреса переменной из "пользовательского пространства" в физический адрес (это нужно для shared операций между процессами). Далее, от полученного адреса вычисляется 32 битный хэш (так называемый jhash2). Затем вычисляется индекс: от полученного значения берётся маска, что-то типа ( hash & ((1<<20) — 1 ) ). Значение этой маски сильно зависит от системы (настроек, количества процессоров), но обычно она не превышает 1 МБ. Полученный индекс используется для индексации в глобальной таблице, описывающей все futex-объекты. В итоге, если есть в системе какой-либо другой процесс, у которого есть своя переменная 'B' и индекс, подсчитанный от этой переменной совпадёт с индексом переменной 'A' и "выставится событие" по переменой 'B' — то выставится это-же событие и для переменной 'A', т.е. для неё ('A') произойдёт "ложное пробуждение". Вероятность данного явления небольшая, но всё-же есть._>Интересует собственно сабж — откуда берутся эти самые "ложные пробуждения" ?