c协程实现,C语言协程
C协程使用举例狙击手博客园
C协程使用举例本篇使用上一篇提供的接口,实现一个简单的协程调度框架。
基本思想是,创建一个调度器,用于将处于活动状态的协程调度运行,调度器维护着一个激活的列表,
调用卵创建协程时,将新建立的协程添加到活动列表中。
调用安排将启动调度器主循环。
科罗
# CORO国际机场
#定义CORO_H
#包含stdint.h
#包含" uthread.h "
结构缩阳症
结构coro * next
uthread _ t ut
uint32 _ t id
开始_乐趣st _乐趣
uint32_t是_ end
结构测试
结构coro * sche
结构coro *公司
void* yield(struct coro*,struct coro*,void *);
void* resume(struct coro*,struct coro*,void *);
结构调度程序
struct coro * active//处于激活态的缩阳症
结构coro *自我
结构调度程序* scheduler _ create();
//生成一个缩阳症运行开始运行
void spawn(struct scheduler*,void *stack,uint32_t stack_size,start _ fun);
//调度缩阳症运行
空的调度(结构调度程序*);
#endifcoro.c
#包含"科罗. h "
#包含标准库
#包含时间。h
void* yield(struct coro *from,struct coro *to,void *arg)
返回uthread_swtch(from- ut,to- ut,arg);
void* resume(struct coro *from,struct coro *to,void *arg)
返回uthread_swtch(from- ut,to- ut,arg);
静态uint 32 _ t g _ index=0;
静态void* coro_start_fun(void *arg)
struct testarg * _ arg=(struct testarg *)arg;
void * ret=_ arg-co-ST _ fun(_ arg);
_ arg-co-is _ end=1;
返回浸水使柔软
虚空产卵(结构调度程序*sche,void *stack,uint32_t stack_size,start_fun st_fun)
ut hread _ t ut=ut hread _ create(stack,stack _ size);
struct coro * co=(struct coro *)malloc(sizeof(* co));
co-ut=ut;
co-ST _ fun=ST _ fun;
co-id=g _ index;
//添加到激活队列中
co-next=sche-active;
co-is _ end=0;
sche-active=co;
uthread_make(co- ut,sche- self- ut,coro _ start _ fun);
结构调度程序*scheduler_create()
struct scheduler * sche=(struct scheduler *)malloc(size of(* sche));
sche-active=0;
sche-self=(struct coro *)malloc(sizeof(* sche-self));
sche- self- ut=uthread_create(0,0);
返回血清胆碱酯酶
无效计划(结构计划程序*计划)
while(1)
if(sche- active)
struct coro * cur=sche-active;
sche-active=0;
while(cur)
struct testarg arg={sche- self,cur };
简历(sche- self,cur,arg);
struct coro * tmp=cur-next;
如果(!cur- is_end)
cur-next=sche-active;
sche-active=cur;
当前=tmp
其他
ut hread _ destroy((cur-ut));
免费(cur);
当前=tmp
其他
打破;
}测试。c
#包含标准视频
#包含标准库
#包含stdint.h
#包含" uthread.h "
#包含"科罗. h "
空*乐趣(空*参数)
struct testarg * _ arg=(struct testarg *)arg;
int I=0;
while(i 10)
printf(%d\n ,_ arg-co-id);
yield(_arg- co,_arg- sche,0);
我;
返回0;
int main()
struct scheduler * sche=scheduler _ create();
spawn(sche,malloc(4096),4096,fun);
spawn(sche,malloc(4096),4096,fun);
spawn(sche,malloc(4096),4096,fun);
spawn(sche,malloc(4096),4096,fun);
附表(sche);
返回0;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。