Ответ 1
Они не работают параллельно, они по очереди. Когда прогресс заблокирован для текущей задачи, он сохраняет свое состояние и дает управление готовой задаче. Это совместная многозадачность, а не true parallelism.
Резьбы работают по принципу выборки. Однако есть несколько ключевых различий, которые я хотел бы выделить.
Во-первых, просто потому, что async
/await
не являются потоками ОС:
- Задачи не будут видеть разные идентификаторы потоков.
- Потоковое локальное хранилище не переключается автоматически при выполнении задачи.
Во-вторых, различия в поведении:
-
async
/await
используют совместную многозадачность, потоки Win32 используют пре-абсорбцию. Поэтому необходимо, чтобы все блокирующие операции явно приводили к управлению с помощью моделиasync
/await
. Таким образом, вы можете заблокировать весь поток и все его задачи, сделав блокирующий вызов функции, не написанной для вывода. - Задачи не будут выполняться параллельно в многопроцессорной системе. Поскольку управление повторным подключением контролируется, это упрощает согласование структуры данных.
Как отмечает Стивен в комментарии, вы можете выполнять одновременное выполнение в нескольких потоках ОС (вместе со всеми сложностями и потенциальными условиями гонки), если вы используете многопотоковый контекст синхронизации. Но котировки MSDN касались однопоточного контекста.
Наконец, в других местах используется эта же парадигма дизайна, вы можете много узнать о хороших практиках для async
/await
, изучив их:
- Win32 Fibers (использует тот же стиль вызова, что и потоки, но сотрудничает)
- Операции ввода/вывода Win32 Overlapped, Linux aio
- Сопрограммы