Существует стандартное предложение C ++ для поддержки сопрограмм - N3708 , написанное Оливером Ковальке (автором Boost.Coroutine ) и Гудспид .
Полагаю, в конечном итоге это будет окончательно чистое решение (если это произойдет ...)
Поскольку у нас нет поддержки обмена стека от компилятора C ++, сопрограммам в настоящее время требуется взлом на низком уровне (обычно на уровне сборки или setjmp / longjmp), и это вне диапазона абстракции C ++. Тогда реализации являются хрупкими, и им нужна помощь компилятора, чтобы быть надежным.
Например, очень сложно установить размер стека контекста сопрограммы, и если вы переполните стек, ваша программа будет молча повреждена. Или сбой, если вам повезет. Сегментированный стек может помочь в этом, но опять же, для этого нужна поддержка на уровне компилятора.
Если он станет стандартным, об этом позаботятся авторы компилятора. Но до этого дня Boost.Coroutine был бы для меня единственным практическим решением на C ++.
В C есть libtask
, написанный Russ Cox (который является членом команды Go). libtask
работает довольно хорошо, но, похоже, больше не поддерживается.
P.S. Если кто-то знает, как поддержать стандартное предложение, пожалуйста, дайте мне знать. Я действительно поддерживаю это предложение.