Java Object.wait() предупреждает о "побочных пробуждениях", но С# Monitor.wait(), похоже, не упоминает об этом вообще.
Увидев, как Mono реализована поверх Linux, а Linux ложные пробуждения, не следует ли это документировать где-нибудь?
Java Object.wait() предупреждает о "побочных пробуждениях", но С# Monitor.wait(), похоже, не упоминает об этом вообще.
Увидев, как Mono реализована поверх Linux, а Linux ложные пробуждения, не следует ли это документировать где-нибудь?
Joe Duffy "Параллельное программирование в Windows" упоминает об этом (P311-312, P598). Этот бит интересен:
Обратите внимание, что во всех вышеприведенных примерах потоки должны быть устойчивыми к чему-то, называемому ложными пробуждениями - код, который использует переменные условия, должен оставаться верным и живым даже в тех случаях, когда он пробуждается преждевременно, то есть до того, был создан. Это связано не только с тем, что реализация на самом деле будет делать такие вещи (хотя некоторые реализации на других платформах, таких как Java и Pthreads, как известно, делают это), а также потому, что код будет разворачивать темы намеренно, когда это не нужно, а скорее из-за того, что нет гарантировать, когда поток, который был пробужден, станет запланированным. Переменные условия не справедливы. Возможно, и даже вероятно, что другой поток приобретет связанный замок и снова сделает условие ложным, прежде чем пробужденная нить получит шанс запереть замок и вернуться в критическую область.
Затем он дает нормальный шаблон для цикла while, проверяющего условие.
Я бы сказал, что из этого разумно ожидать, что Monitor.Wait
обычно не разбудит вас преждевременно, и что, если вы абсолютно знаете, что ничто другое не могло изменить состояние, тогда вы могли бы уйти без условия loop: но это безопаснее включать его в любом случае, на случай, если ваша логика неточна.