Spurious wakeup

редактировать

A ложное пробуждение происходит, когда поток просыпается от ожидания условной переменной, о которой поступил сигнал, только для того, чтобы обнаружить, что условие, которого он ждал, не выполняется. Это называется ложным, потому что нить, казалось бы, была разбужена без причины. Но ложные пробуждения не происходят без всякой причины, они обычно случаются, потому что между моментом, когда переменная условия была сигнализирована, и когда ожидающий поток, наконец, запустился, другой поток запустил и изменил условие. Между потоками было состояние гонки, что обычно приводило к тому, что иногда поток, просыпающийся по переменной условия, запускается первым, выиграв гонку, а иногда - вторым, проигрывая гонку.

Во многих системах, особенно в многопроцессорных системах, проблема ложного пробуждения усугубляется, потому что, если есть несколько потоков, ожидающих переменной условия, когда она сигнализируется, система может решить разбудить их всех, обрабатывая каждые signal (), чтобы разбудить один поток как broadcast (), чтобы разбудить их всех, тем самым нарушив любое возможное ожидаемое соотношение 1: 1 между сигналами и пробуждениями. Если есть десять ожидающих потоков, только один выиграет, а остальные девять испытают ложное пробуждение.

Чтобы обеспечить гибкость реализации при работе с ошибочными состояниями и гонками внутри операционной системы, переменным условия также может быть разрешено возвращаться из ожидания, даже если не было сигнала, хотя неясно, сколько реализаций на самом деле это делают.. В реализации переменных состояния Solaris ложное пробуждение может происходить без сигнализации условия, если процесс сигнализируется; системный вызов ожидания прерывается и возвращает EINTR. Реализация переменных состояния pthread в Linux гарантирует, что этого не произойдет.

Поскольку ложное пробуждение может произойти всякий раз, когда есть гонка и, возможно, даже при отсутствии гонки или сигнала, когда поток просыпается по переменной условия, он всегда должен проверять выполнение искомого условия. Если это не так, он должен вернуться в режим сна по переменной условия, ожидая другой возможности.

Ссылки
Последняя правка сделана 2021-06-09 04:04:00
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте