作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我知道 C 和 C++ 中协程的习惯用法或模式:
struct cofunctor {
int state = 0;
void operator () () {
switch ( state ) {
case 0: // Caller must initialize to 0
if ( bar1 ) return;
while ( bar2 ) {
state = 1; case 1:
if ( bar3 ) return;
state = 2; case 2:
if ( bar4 ) return;
}
state = 3; case 3:
return;
}
}
};
当函数执行时,它会更新持久检查点变量。下次调用时,该值用于跳转到执行的中间。在实践中,检查点将不仅仅是一个 int
,而是包含“局部”变量。
我正在用 C++ 编写。我的用例很少产生结果,所以我只想在异常处理期间更新检查点。
这种模式在实际实践中是否为人所知,还是仅作为好奇记录在案? C++ 中是否存在可重用的实现?
(据我所知,Boost.Coroutine 使用不一致的堆栈 hack,与 longjmp
多线程不同。我的应用程序很少使用协程控制流,堆栈使用率可能在众多“线程”,所以它不适合这样的实现。)
最佳答案
Does a reusable implementation exist in C++?
This article还谈到一个one header ,驻留在 Boost.ASIO 库中的无堆栈实现。
Another ASIO header 似乎表明他们比之前的状态更进了一步,但我对这个了解不多。可能与上次相同,也可能不同。
关于c++ - 基于开关的协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24202890/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!