Здравствуйте, netch80, Вы писали:
S>>Ядро ОС может отобрать управление у выполняющегося процесса/потока при истечении кванта времени, выделенного на выполнение. С точки зрения программиста это означает, что управление могло уйти от потока в «самый неподходящий» момент времени, когда структуры данных могут находиться в противоречивом состоянии из-за того, что их изменение не было завершено.
N>И что? ОС всё равно должна будет сделать это рано или поздно, если задача сама не отдаёт управление. А если отдаёт, то зачем ОС принудительно переключать?
То что желательно указать в какие моменты можно переключать. Например дождаться выполнения lock
S>> Поэтому async await то есть задачи предпочтительнее потоков
N>Нет, само по себе ничего из цитированного не является тут аргументом в сторону async/await. Там точно так же — если управление отдано явно, то шедулер не будет забирать насильно, а если нет, то заберёт — скорее всего, средствами ОС. Более того, если в момент переключения на входе или выходе await не будет явно сказано "а теперь подумайте, не переключить ли" соответствующим системным вызовом, то ОС не будет знать, когда там userland занимается переключением вокруг awaitʼа, и тоже переключит в непредсказуемый (и, возможно, неподходящий) момент.
Ну как же не. Как раз проблема в большей степени это проблемы с Синхронизирующие примитивы ядра. Мьютексы, Семафоры, эвенты и т. д.
Для примера в эпоху до async/await поток ждет выполнения асинхронной операции.
async/await берет на себя сохранения данных внутри класса (стек не нужен) и строит автомат и тот же поток который выполнял данную задачу, запускает другую. Нет никаких переключений.
Не зря же используют SpinLock. Если бы стоимость переключения была не важна, то нафига он нужен?
Зачем тогда async/await
Ну и замена всяких Lock на ManualResetValueTaskSource
http://rsdn.org/forum/dotnet/8030645.1Автор: Serginio1
Дата: 16.06.21
https://stackoverflow.com/questions/66387225/awaiting-a-single-net-event-with-a-valuetask
Конечно зависит от длительности задач, но если задачи непродолжительные, то пул потоков может и не переключаться а выполнять очередь заданий.