Mar 03, 2023 16:30
В асинхронном коде (в современном понимании этого термина), что в С++, что в C# не получится использовать классические примитивы синхронизации (мьютексы, семафоры и т.п.) по причине того, что код может произвольно менять исполняющую его нить. Надо использовать специальные примитивы. В .NET - это SemaphoreSlim, к примеру.
А вот что менее очевидно - ровно также в асинхронном коде не должно быть Thread.Sleep. Эта функция блокирует исполняющую нить, не «отпуская» её обратно в pool (если, конечно, асинхронный код исполняется в контексте thread pool'а), но и не нагружая её какими-то реальными вычислениями. В C# вместо этого надо звать await Task.Delay.
Кстати, есть интуитивное формально недоказанное подозрение, что асинхронные аналоги мьютексов, семафоров и прочих барьеров не выйдет написать на синхронных примитивах.
засады,
рефлексия,
любопытное