赞
踩
至于PT_END,其作用除了清除pt指针以外,主要是为了返回协程的状态。实际上PT_YIELD中的return也是带值的,之所以foo函数要声明为int,就是为了每次调用foo都能得到该协程当前的状态,是挂起了、结束了,还是中途退出了等等。
应该注意到了一点,就是既然每次重入协程都要重新调用foo函数,则说明foo函数中留不下任何状态,如果定义局部变量,则其内容都会丢失。嗯……这就是我指的“繁琐与不便”的主要所在吧,你需要让一切协程状态都以外部变量的形式存在,典型做法是封装成一个结构体,作为该函数的第二个参数。嗯,毕竟,C是接近底层的语言,让它自动背着你创建好多变量的副本,或者好多个协程局部的堆栈,还是不如你自己精确掌控对每块内存的使用,不是吗?毕竟不能用脚本语言的眼光来看C ^_^
现在,用这种方式创建了好多协程,那么接下来用一个简单的方式让它们运转起来,这个轮转调度简单得难以置信:
while (1) {
foo1(p1);
foo2(p2);
...
foon(pn);
}
这就是调度器的主循环,只需要往复依次调用每个协程的入口函数即可。
以上叙述了Protothreads库的核心内容,实际上该库还包含了动态协程建立、协程间通信等设施,对于一个如此单薄的库来说,还是相当令人惊喜的。最后为了再次强调其单薄,在此列举一下其所有的头文件:
lc-addrlabels.h 用GCC语法扩展实现的协程基础
lc-switch.h 用switch语句实现的协程基础
lc.h 该文件存在的意义仅仅为了选择以上两者之一
pt.h 基于lc.h的协程设施的真正实现
pt-sem.h 协程间通信(信号量)的实现
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。