С# Monitor.Wait() страдает от побочных пробуждений?

Java Object.wait() предупреждает о "побочных пробуждениях", но С# Monitor.wait(), похоже, не упоминает об этом вообще.

Увидев, как Mono реализована поверх Linux, а Linux ложные пробуждения, не следует ли это документировать где-нибудь?

Ответ 1

Joe Duffy "Параллельное программирование в Windows" упоминает об этом (P311-312, P598). Этот бит интересен:

Обратите внимание, что во всех вышеприведенных примерах потоки должны быть устойчивыми к чему-то, называемому ложными пробуждениями - код, который использует переменные условия, должен оставаться верным и живым даже в тех случаях, когда он пробуждается преждевременно, то есть до того, был создан. Это связано не только с тем, что реализация на самом деле будет делать такие вещи (хотя некоторые реализации на других платформах, таких как Java и Pthreads, как известно, делают это), а также потому, что код будет разворачивать темы намеренно, когда это не нужно, а скорее из-за того, что нет гарантировать, когда поток, который был пробужден, станет запланированным. Переменные условия не справедливы. Возможно, и даже вероятно, что другой поток приобретет связанный замок и снова сделает условие ложным, прежде чем пробужденная нить получит шанс запереть замок и вернуться в критическую область.

Затем он дает нормальный шаблон для цикла while, проверяющего условие.

Я бы сказал, что из этого разумно ожидать, что Monitor.Wait обычно не разбудит вас преждевременно, и что, если вы абсолютно знаете, что ничто другое не могло изменить состояние, тогда вы могли бы уйти без условия loop: но это безопаснее включать его в любом случае, на случай, если ваша логика неточна.