Я понимаю, что в очередях ожидания ядра Linux выражение условия оценивается после того, как текущий поток ставится в очередь в списке ожидающих. Но что произойдет, если выражение условия включает блокировку?
Например:
поток A вызывает wait_event(wq,blocking_condition ) -> поток A добавляется в очередь wq, затем оценивается Blocking_condition, который блокируется, скажем, мьютексом. На этом этапе поток A блокируется в двух местах.
thead B вызывает Wake_up(wq)
поток A просыпается и продолжает работу , хотя он все равно должен ожидать этот мьютекс.
Применяется ли здесь какая-то специальная обработка (т. е. все блокирующие примитивы в ядре могут обрабатывать ложные пробуждения) или это чистое издевательство?
Я понимаю, что в очередях ожидания ядра Linux выражение условия оценивается после того, как текущий поток ставится в очередь в списке ожидающих. Но что произойдет, если выражение условия включает блокировку? Например: [list] [*]поток A вызывает wait_event(wq,blocking_condition ) -> поток A добавляется в очередь wq, затем оценивается Blocking_condition, который блокируется, скажем, мьютексом. На этом этапе поток A блокируется в двух местах. [*]thead B вызывает Wake_up(wq) [*]поток A просыпается и продолжает работу , хотя он все равно должен ожидать этот мьютекс. [/list] Применяется ли здесь какая-то специальная обработка (т. е. все блокирующие примитивы в ядре могут обрабатывать ложные пробуждения) или это чистое издевательство?