Skip to content

协程的一些想法 #124

@Andre-HJR

Description

@Andre-HJR

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

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

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

达夫设备的出现是个十分偶然的"故事",但是这个"故事"却比较好的给出了一个在栈中捕获状态机的方案, 即无栈协程的方案: 在栈中利用 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; }
          }
        }
      }
    }
  }
}

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions