Есть ли какие-нибудь креативные идеи, чтобы избежать взаимоблокировок на выходе или в спящем режиме с помощью кооперативной / неперегрузочной многозадачности без выполнения O / S Thread.Sleep (10)? Обычно вызовы yield или sleep перезванивают в планировщик для запуска других задач. Но иногда это может привести к тупикам.
Некоторый фон:
Это приложение имеет огромную потребность в скорости и пока очень быстро по сравнению с другими системами в той же отрасли. Одним из методов ускорения является кооперативная / не вытесняющая многопоточность, а не стоимость переключения контекста из потоков O / S.
Высокоуровневый дизайн менеджера приоритетов, который вызывает задачи в зависимости от приоритета и времени обработки. Каждая задача выполняет одну «итерацию» работы и возвращается, чтобы снова дождаться своей очереди в очереди с приоритетами.
Хитрость с не вытесняющим потоком заключается в том, что делать, если вы хотите, чтобы определенная задача остановилась в середине работы и подождала какое-то другое событие из другой задачи, прежде чем продолжить.
В этом случае у нас есть 3 задачи: A B и C, где A - контроллер, который должен синхронизировать действия B и C. Сначала A запускает и B, и C. Затем B возвращает результат, так что C вызывается. Когда C уступает, A видит, что они оба неактивны, решает, что пора работать B, но еще не время для C. Скважина B теперь застряла в добыче, которая называется C, поэтому она никогда не сможет работать.