zoukankan      html  css  js  c++  java
  • 用c语言简单模拟协程

    看了云风的http://blog.codingnow.com/2012/07/c_coroutine.html,他实现了一个简单的协程调度。

    我这里仅仅是用c语言模拟了协程,原理很简单。

    主要是:

    getcontext()

    makecontext()

    swapcontext()

    这几个函数。具体api详解见http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html

    #ifndef _CORO_H
    #define _COEO_H
    #include <ucontext.h>
    typedef void (*coro_func)(void *);
    typedef struct coro_context
    {
            ucontext_t context;
            coro_func func;
            void *argv;
            char *sptr;
            size_t ssize;
    }coro_context_t;
    coro_context_t* coro_create(coro_func coro,void *arg,void *sptr,size_t ssize);
    void coro_transfer (coro_context_t *prev, coro_context_t *next);
    void coro_destroy (coro_context_t *ctx);
    #endif
    #include"coro.h"
    #include <stdlib.h>
    coro_context_t* coro_create(coro_func func,void *arg,void *sptr,size_t ssize)
    {
        coro_context_t *ctx = (coro_context_t*)malloc(sizeof(coro_context_t));
        getcontext(&ctx->context);
        ctx->context.uc_link = 0;
        ctx->context.uc_stack.ss_sp = sptr;
        ctx->context.uc_stack.ss_size = ssize;
        ctx->context.uc_stack.ss_flags = 0;
        makecontext(&ctx->context, (void (*)(void)) func, 1, arg);
        return ctx;
    }
    
    
    void coro_transfer (coro_context_t *prev, coro_context_t *next)
    {
        swapcontext(&prev->context, &next->context);
    }
    
    void coro_destroy (coro_context_t *ctx)
    {
        free(ctx);
    }
    #include"coro.h"
    #include<stdio.h>
    coro_context_t *coro1;
    coro_context_t *maincoro;
    char stack1[1024*16];
    char stack2[1024*16];
    void test1(void *argv)
    {
        printf("test\n");
    }
    int main(){
        coro1 = coro_create(test1,NULL,stack1,1024*8);
        maincoro = coro_create(NULL,NULL,stack2,1024*8);
        while(1){
            coro_transfer(maincoro,coro1);
            printf("main\n");
        }
        coro_destroy(coro1);
        coro_destroy(maincoro);
    }
  • 相关阅读:
    奶牛跑步2
    数据结构练习
    HighChats报表使用C#mvc导出本地图片
    选择论
    投票选举
    价值
    工作5年后总结的工作经验
    formValidator 不支持jquery1.9以上的解决办法
    随想29:没有最完美的制度,只有最适合的制度
    随想28:愿我成为一个高级黑
  • 原文地址:https://www.cnblogs.com/xloogson/p/2606738.html
Copyright © 2011-2022 走看看