- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2013-04-16 16:47 编辑
qinggeng 发表于 2013-04-16 12:43 ![]()
实际的代码?
这个,不扣题吧?人家说单线程asio,我说多线程asio。- static void *thread_work(void *param)
- {
- resource *rs=(resource *)param;
- int ret,fds;
- TCB *task;//你可以按需要定义你自己的context。
- port_event_t event;
- rs->tid=pthread_self();
- while(1) {
- //从就绪队列取一个任务
- pthread_mutex_lock(&rpool.mut);
- while(!(task=rdy_get())) { //这部分先不要管
- 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) {
- ret = port_get(g_port_fd, &event, NULL); //每个线程等事件,solaris的port事件管理器,=epoll_wait
- if(ret < 0){
- ShowLog(1,"%s:port_get err=%d,%s",__FUNCTION__,errno,strerror(errno));
- sleep(30);
- continue;
- }
- task = (TCB *)event.portev_user;//拿到context
- task->events=event.portev_events;
- //检查事件是否健康
- if(!task->call_back && !(event.portev_events&POLLIN)) {
- client_del(task);
- continue;
- }
- }
- // rs->timestamp=
- task->timestamp=now_usec();
- ret=do_work(task);//处理你的context。记住,处理完毕要把你的fd重新加入g_port_fd。好进行下一阶段的工作。
- }
- 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;
- }
复制代码 上述代码实现了彻底异步的TCP代理服务器。
当然那个代理的代码量比较大,但是多线程异步处理就在这了。
|
|