Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

协程的一些想法 #124

Open
Andre-HJR opened this issue Jun 24, 2023 · 0 comments
Open

协程的一些想法 #124

Andre-HJR opened this issue Jun 24, 2023 · 0 comments

Comments

@Andre-HJR
Copy link

无栈协程的方案之一 -- 达夫设备 ( 从语言的角度来看 )

这是属于第八章的主题,是自己学习协程的一点心得,希望对相应的工作有所帮助.

前置的一些文章 ( 建议看一下 )

达夫设备的出现是个十分偶然的"故事",但是这个"故事"却比较好的给出了一个在栈中捕获状态机的方案, 即无栈协程的方案: 在栈中利用 switch(in C++), loop(Rust) . 前者Boost(v1.66)已经有相关的设计实现,其源码在boost/asio/coroutine.hppboost/asio/yield.hpp,中, 后者则是自己偶然的一个Rust尝试,见如下代码:

#[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; }
          }
        }
      }
    }
  }
}

协程是为了更好复用线程资源.对于有栈线程,代码工作者,往往需要自行设计合适的异步结构,同步结构的存储队列,唤醒机构和执行机构,工作的难度主要也来自前述的四个方面,需要应对不同的现实环境组织四个方面的"交互".而无栈的协程,从代码上看,虽然没有有栈的复杂,但也需要控制好相应的状态转换,无栈的方案(达夫设备)依赖语言设计者或无意或有意留下的"语言缺口".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant