Ложное пробуждение
Тон или стиль этой статьи могут не отражать энциклопедический тон , используемый в Википедии . ( сентябрь 2020 г. ) |
В вычислениях происходит ложное пробуждение , когда поток просыпается после ожидания условной переменной без удовлетворения этой переменной. Его называют ложным, потому что поток, по-видимому, был разбужен без всякой причины. Однако обычно они происходят потому, что между моментом, когда была сигнализирована условная переменная, и моментом, когда ожидающий поток наконец запустился, другой поток запустился и изменил условие, вызывая состояние гонки . Если поток просыпается на секунду, он проиграет гонку и произойдет ложное пробуждение. [ нужна ссылка ]
Проблема ложного пробуждения может усугубиться в многопроцессорных системах. Когда несколько потоков ожидают одной условной переменной, система может решить разбудить все потоки, когда об этом поступит сигнал. Система рассматривает каждое signal( )
чтобы разбудить один поток как broadcast( )
чтобы разбудить их всех, тем самым нарушив любое возможно ожидаемое соотношение 1:1 между сигналами и пробуждением. [1] Если десять потоков ожидают, только один выиграет, а остальные девять испытают ложное пробуждение. [ нужна ссылка ]
Чтобы обеспечить гибкость реализации при работе с ошибками и гонками внутри операционной системы, переменным состояния также может быть разрешено возвращаться из ожидания, даже если не сигнализируется, хотя неясно, сколько реализаций это делают. В реализации условных переменных Solaris ложное пробуждение может произойти без назначения условия, если процесс является сигнальным; системный вызов ожидания прерывается и возвращается EINTR
. [2] Реализация условных переменных в p-потоке Linux гарантирует, что этого не произойдет. [3] [4]
Поскольку может произойти ложное пробуждение, когда поток просыпается по условной переменной, он всегда должен проверять, что искомое условие удовлетворено. Если это не так, ему следует вернуться в режим ожидания с условной переменной, ожидая другой возможности. [5]
Ссылки
[ редактировать ]- ^ Раймонд Чен (1 февраля 2018 г.). «Ложные пробуждения в переменных состояния Win32» . Проверено 9 мая 2020 г.
- ^ «Прерванное ожидание переменных состояния (только потоки Solaris)» . Корпорация Оракл . Проверено 9 мая 2020 г.
- ^
«pthread_cond_wait(3) — справочная страница Linux» . сайт die.net . Проверено 9 мая 2020 г.
Эти функции не должны возвращать код ошибки [EINTR].
- ^ «pthread_cond_timedwait, pthread_cond_wait — ожидание по условию» . Открытая группа . 2018 . Проверено 9 мая 2020 г.
- ^ Арпачи-Дюссо, Ремзи; Арпачи-Дюссо, Андреа (ноябрь 2023 г.). «Переменные состояния» (PDF) . Операционные системы: три простых элемента .