- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2011-07-20 16:35 编辑
谢谢~ 原来epoll_wait也是线程安全的,这样看来epoll真的做的很不错,对开发者非常有好,我会尽量用ep ...
ydfgic 发表于 2011-07-20 15:39 ![]()
给你看看我的任务调度器,很短小,很精彩。- static void *thread_work(void *param)
- {
- resource *rs=(resource *)param;//线程池指针
- int ret,fds;
- TCB *task;
- struct epoll_event event;
- rs->tid=pthread_self();
- while(1) {
- //从就绪队列取一个任务
- pthread_mutex_lock(&rpool.mut);//非IO事件队列,例如取得连接池后的任务要回到这里等待执行
- while(!(task=rdy_get())) {//这是一个L/F模型,tpool.rdy_num通常=1,1个Leader。多了无益。
- if(rpool.flg >= tpool.rdy_num) break;
- rpool.flg++;
- ret=pthread_cond_wait(&rpool.cond,&rpool.mut); //没有任务,等待
- rpool.flg--;
- }
- pthread_mutex_unlock(&rpool.mut);
- if(!task) {//所有没有成为leader的线程都作为follower,全在epoll_wait上竞争。
- fds = epoll_wait(g_epoll_fd, &event, 1 , -1);
- if(fds < 0){
- ShowLog(1,"%s:epoll_wait err=%d,%s",__FUNCTION__,errno,strerror(errno));
- sleep(30);
- continue;
- }
- task = (TCB *)event.data.ptr;
- task->events=event.events;
- //检查事件是否健康
- if(!task->call_back && !(event.events&EPOLLIN)) {
- do_epoll(task,EPOLL_CTL_DEL);
- client_del(task);
- continue;
- }
- }
- // rs->timestamp=
- task->timestamp=now_usec();
- ret=do_work(task);//不论收、发、出错都有统一的工作程序处理。
- }
- ShowLog(1,"%s:tid=%lu canceled",__FUNCTION__,pthread_self());
- mthr_showid_del(rs->tid);
- rs->timestamp=now_usec();
- rs->status=0;
- rs->tid=0;
- return NULL;
- }
复制代码 |
|