Фома писал(а):
И тут меня заело. Чичас попробую на С# повторить такой фокус

З.Ы. Только кофе попью

Ага ... только приготовтесь долго ждать.
Я как-то написал программу (на с++) с самодельным механизмом синхронизации.
Вместо EnterCriticalSection использовал WaitForSingleObject плюс незащищёные переменные (почти как в примере).
И моя программа примерно раз в месяц! зависала по "непонятным причинам".
После скурпулёзного анализа всего кода (довольно большого) я пришёл к выводу, что эти зависания не могут быть ничем иным чем тем самым маловероятным случаем , когда поток задачи будет прерван именно между теми двумя операциями , вероятность чего я считал бесконечно малой ...
Но ... после изменения метода синхронизации зависания прекратились.
Так, что кто хочет на деле проверить вариант с переменой очереди выполнения ... пусть приготовится к долгому ожиданию.
Во первых сама вероятность прерывания именно в этом месте очень мала (а у C# могут быть свои соображения на этот счёт - где переключать задачи), во вторых, ещё сама вероятность смены очереди вычислений должна быть не очень велика (если вообще это не относится к операторам с разным временем исполнения) и плюс есть ещё вариант, что неизвестно - может ли быть в этот момент вообще быть прерван поток...
Короче не менее месяца придётся ждать.
А ещё возможно что, для "успеха" эксперимента, обе переменные должны находиться на разных страницах памяти ... ну тут уж вероятность ещё в несколько тысяч раз меньше.