Open Andre-HJR opened 1 year ago
这是属于第八章的主题,是自己学习协程的一点心得,希望对相应的工作有所帮助.
前置的一些文章 ( 建议看一下 )
深入理解达夫设备
Coroutines in C
达夫设备的出现是个十分偶然的"故事",但是这个"故事"却比较好的给出了一个在栈中捕获状态机的方案, 即无栈协程的方案: 在栈中利用 switch(in C++), loop(Rust) . 前者Boost(v1.66)已经有相关的设计实现,其源码在boost/asio/coroutine.hpp和boost/asio/yield.hpp,中, 后者则是自己偶然的一个Rust尝试,见如下代码:
switch
loop
boost/asio/coroutine.hpp
boost/asio/yield.hpp
#[allow(unreachable_code)] const STATE_NUM: i32 = 68; fn _fun_duff_device_coroutine() { let mut state: i32 = 0; let mut i: i32 = 0; 'outer: loop { loop { match state { 0 => { state = 1; continue 'outer; } _ => { loop { state = 1; i += 1; if i >= STATE_NUM { break 'outer; } else { continue 'outer; } } } } } } }
协程是为了更好复用线程资源.对于有栈线程,代码工作者,往往需要自行设计合适的异步结构,同步结构的存储队列,唤醒机构和执行机构,工作的难度主要也来自前述的四个方面,需要应对不同的现实环境组织四个方面的"交互".而无栈的协程,从代码上看,虽然没有有栈的复杂,但也需要控制好相应的状态转换,无栈的方案(达夫设备)依赖语言设计者或无意或有意留下的"语言缺口".
无栈协程的方案之一 -- 达夫设备 ( 从语言的角度来看 )
前置的一些文章 ( 建议看一下 )
深入理解达夫设备
Coroutines in C
达夫设备的出现是个十分偶然的"故事",但是这个"故事"却比较好的给出了一个在栈中捕获状态机的方案, 即无栈协程的方案: 在栈中利用
switch
(in C++),loop
(Rust) . 前者Boost(v1.66)已经有相关的设计实现,其源码在boost/asio/coroutine.hpp
和boost/asio/yield.hpp
,中, 后者则是自己偶然的一个Rust尝试,见如下代码:协程是为了更好复用线程资源.对于有栈线程,代码工作者,往往需要自行设计合适的异步结构,同步结构的存储队列,唤醒机构和执行机构,工作的难度主要也来自前述的四个方面,需要应对不同的现实环境组织四个方面的"交互".而无栈的协程,从代码上看,虽然没有有栈的复杂,但也需要控制好相应的状态转换,无栈的方案(达夫设备)依赖语言设计者或无意或有意留下的"语言缺口".