Следующий чрезвычайно интересный вопрос (и новый для C++) - это корутины...
Подробно о корутинах в C++
12 марта 2020
Корутины уже существуют во многих языках программирования, например, в Python или C#. Корутины – это еще один способ создания асинхронного кода.
Корутины в C++20. Часть 1 +18В зависимости от того, в какой среде они используются, их могут называть:
- Бесстековые корутины
- Стековые корутины
- Зеленые потоки
- Волокна
- Горутины
Хорошая новость: стековые корутины, зеленые потоки, волокна и горутины суть одно и то же (но используются они иногда по-разному). О них мы поговорим ниже в этой статье и будем называть их волокнами или стековыми корутинами. Но у бесстековых корутин есть некоторые особенности, о которых необходимо поговорить отдельно.
26.09.20 10:26
Корутины это функции которые могут приостановить или возобновить свое выполнение при этом сохраняя свое состояние. Эволюция функций в C++ сделала шаг вперед.
P.S. Почему возник такой интерес к корутинам? И почему возник только сейчас?Идея корутин, представленная как новая в C++20, довольно стара. Понятие корутины было предложено Мелвином Конвеем. Он использовал данное понятие в публикации о разработке компиляторов от 1963. Дональд Кнут называл процедуры частным случаем корутин. Иногда должно пройти время чтобы та или иная идея была принята.
Посредством новых ключевых слов co_await и co_yield C++20 расширяет понятие выполнения функций в C++ при помощи двух новых концепций.
Как я понимаю ситуацию:
- потому что корутины переключают контекст выполнения без вмешательства ядра, без аппаратного переключения контекста процессора как у thread...
- и происходить это может намного (на порядок) быстрее...
- и особенно показала это организация параллелизма в языке Go, его горутины, которые во многом реализуются как корутины, переключаемые а пространстве пользователя.
P.P.S. О механизме планирования Go я как-то перевёл статью для сайта Go, вот здесь - Диспетчер Go
Оригинал здесь: The Go schedulerПеревод статьи "The Go scheduler" от Daniel Morsing.
30 JUNE 2013
Потоки имеют свою собственную сигнальную маску, могут быть прикреплены к процессорам с помощью аффинити маски, могут быть введены в группы, и могут быть тестированы на предмет того какие ресурсы они используют. Все эти элементы добавляют накладные расходы для объектов, а, поскольку они просто не нужны для Go программ использующих Go-рутины, эти накладные расходы лавинно складываются, когда у вас становится 100000 потоков в вашей программе.