Подтвердить что ты не робот

Асинхронные и ожидающие ключевые слова не создают дополнительные потоки?

Я в замешательстве. Как один или несколько Task выполняются параллельно в одном потоке? Мое понимание parallelism явно неверно.

Биты MSDN Я не могу обернуть вокруг себя:

Асинхронные и ожидающие ключевые слова не вызывают дополнительных потоков создано. Асинхронные методы не требуют многопоточности, поскольку асинхронный метод не запускается в своем потоке. Метод работает на текущем синхронизации и использует время в потоке только тогда, когда метод активен.

.. и:

Между запуском задачи и ее ожиданием вы можете запустить другие задачи. Дополнительные задачи неявно выполняются параллельно, но нет дополнительных потоки создаются.

4b9b3361

Ответ 1

Они не работают параллельно, они по очереди. Когда прогресс заблокирован для текущей задачи, он сохраняет свое состояние и дает управление готовой задаче. Это совместная многозадачность, а не true parallelism.

Резьбы работают по принципу выборки. Однако есть несколько ключевых различий, которые я хотел бы выделить.

Во-первых, просто потому, что async/await не являются потоками ОС:

  • Задачи не будут видеть разные идентификаторы потоков.
  • Потоковое локальное хранилище не переключается автоматически при выполнении задачи.

Во-вторых, различия в поведении:

  • async/await используют совместную многозадачность, потоки Win32 используют пре-абсорбцию. Поэтому необходимо, чтобы все блокирующие операции явно приводили к управлению с помощью модели async/await. Таким образом, вы можете заблокировать весь поток и все его задачи, сделав блокирующий вызов функции, не написанной для вывода.
  • Задачи не будут выполняться параллельно в многопроцессорной системе. Поскольку управление повторным подключением контролируется, это упрощает согласование структуры данных.

Как отмечает Стивен в комментарии, вы можете выполнять одновременное выполнение в нескольких потоках ОС (вместе со всеми сложностями и потенциальными условиями гонки), если вы используете многопотоковый контекст синхронизации. Но котировки MSDN касались однопоточного контекста.

Наконец, в других местах используется эта же парадигма дизайна, вы можете много узнать о хороших практиках для async/await, изучив их:

  • Win32 Fibers (использует тот же стиль вызова, что и потоки, но сотрудничает)
  • Операции ввода/вывода Win32 Overlapped, Linux aio
  • Сопрограммы