C语言实现协程

看到了一个有意思的东西,原文来自Matthew Lee翻译的文章,英文原文Simon Tatham 的文章 Coroutines in C,里面的程序对我来说理解起来有点难度,于是自己写了个更简单的。

基本思想就是用 state 变量来保存函数调用的状态,这里借助 ANSI C 提供了一个名为 __LINE__ 的特殊的宏,代表了当前代码所在的行数。

#define coBegin             \
    static int __state = 0; \
    switch (__state) {      \
        case 0:
#define coYield(x)      \
    __state = __LINE__; \
    return x;           \
    case __LINE__:
#define coEnd }

注意宏展开后 __LINE__coYield 所在的行号,所以两个 __LINE__ 虽然看起来差两行但其实是同一个值。

coYield 可以在 coBegincoEnd 之间任意多次使用,但是不能把两个 coYield 放在同一行里。

给出一个简单的 python 程序

def fib(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b      # 使用 yield
        a, b = b, a + b 
        n = n + 1
 
for n in fib(5): 
    print n

用上面的宏翻译成 C 就是

int fib() {
    static int n = 0, a = 0, b = 1;
    coBegin;
    for (; n < 10; n++) {
        coYield(b);
        b = a + b;
        a = b - a;
    }
    coEnd;
    return -1;
}

int main() {
    for (int i = 0; i < 10; i++) {
        printf("%d, ", fib());
    }
    return 0;
}

又要被 C 语言老师追着打了……

功能更完整的 coroutine.h

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值