【 在 lambdai 的大作中提到: 】
: hmm... 如果是一个非常非常通用的协程模型,这个确实不能接受
: 不过,你之前说你这个是从epoll改过来的,那么epoll下面两个active的fd1和fd2,肯定也不该允许下面的时序
: 1. fd1的callback加线程锁,
: ...................
哦,不是一个场景。
用于通信的fd1和fd2是不可能共享的。
在多线程协程里,被共享的通常是另外的资源。
你可以想象有一个队列,在操作这个队列时需要使用各种线程锁(各个协程都有可能操作这个队列)。在临界区,不允许调用AIO函数。就是说线程锁不允许跨越AIO。
那么单线程协程呢?就是:线程锁不允许跨越yield。
你要是看我的代码,协程调度代码,可以发现,真跨越了。但是,这是特殊的用法,一般情形是决不允许的。
看看我的yield代码:
pthread_mutex_lock(&task->lock);//防止其他线程提前闯入
ret=do_epoll(task,0,flg);
if(ret<0) {
。。。。。。。。。。
return FORMATERR;
}
ret=swapcontext(&task->uc,&rs->tc);
pthread_mutex_unlock(&task->lock);
------------------
lock跨越了swapcontext!!!
这个代码很好懂吧?把任务交给epoll排队。(自此,随时会有其他线程抓到这个task,若本线程还没完成swap,就悲剧了)
然后本线程swap。swap完成后,在那边解这个锁。
后边的解锁,是解得resume线程的锁。
--
修改:ylh1969 FROM 221.221.48.*
FROM 221.221.48.*