C语言实现简单的协程

@心欲无痕  July 25, 2018

协程是一种用户态的例程,用户可以自由的在多个协程之间进行切换,开销极小,因此在某些场合很适合,比方说系统资源紧张的情况下,并发量上来的前提下,如果使用协程,那么也可以进行一定量的并发处置。

简单的协程利用 switch-case 实现:

int fun()
{
    static int i, state = 0;

    switch(state)
    {
        case 0:
            for (i = 0; i < 5; ++i)
            {
                if ( !i )
                {
                    state = 1;
                    return i;
                }
                printf("C_I: %d\n", i);
                case 1 :;
            }
            state = 0;
    }
    return -1;
}

主函数 main 代码如下:

int main()
{

    printf("%d\n", fun());
    printf("%d\n", fun());
    printf("%d\n", fun());
    printf("%d\n", fun());
    printf("%d\n", fun());
    printf("%d\n", fun());

    return 0;
}

我们可以看到输出结果如下:

JosindeMacBook-Pro:Desktop josin$ ./cor
0
C_I: 1
C_I: 2
C_I: 3
C_I: 4
-1
0
C_I: 1
C_I: 2
C_I: 3
C_I: 4
-1
0
C_I: 1
C_I: 2
C_I: 3
C_I: 4
-1

注意:-1表示协程结束

我们可以看到, 第一次调用函数的时候,协程让出了 CPU 执行时间,因此输出 0, 第二次调用的时候,接着上一次的结果继续执行,因此输出 1、2、3、4,其实这里就是利用了 C 语言的 switch-case 实现了一个标签跳转的协程。实际应用中,也可以使用,不过需要包装依次,或者借助现有的 stackless 实现 或者 setjmp|longjmpucontext


评论已关闭