快速理解Linux多线程及Epoll

来源:互联网 发布:mac鼠标滚轮没反应 编辑:程序博客网 时间:2024/06/03 05:58

我们用网游来简单理解一下这几个概念:

1. 多线程

比如我们要下个副本,自己一个人单力孤(主线程),推不过去怎么办?

最实在的方法,组满人,一起下副本,大家在一个进程(推副本)中互相合作,多个队员就是多线程。

比如我是法师,只管输出;队员中有牧师,只管加血(输入);MT做MT的事......

也有可能我们队伍都是弓手,那么void * func (void *arg){......}就是可以用相同的函数;

只要把第四个参数(人物ID号)传过来就OK了。


——————————————————————————————————————————————————

2. Epoll

说Epoll还得先说下阻塞,listen(),read()都是阻塞的。

这个概念在游戏中十分常见,比如说刀剑中的抢箱子,箱子大概5分钟出现一个,拿齐4个箱子才能继续后面回报丰厚的任务

于是一群人等在出箱子的地方,你也等在那里,在没有抢够箱子之前,你什么其它事都不能做(因为走远了来不急回去),这就是阻塞。

当然,你可以双开,一个等箱子,另一个去推副本,那么这就变成了多线程;

再好的机器,也不能实现过多的开启,比如说十开,在电脑或网速不高的情况下,甚至双开都无法实现;而相对于Linux服务器来说,也不能支持过多的线程,如何利用有限的资源呢? 于是我们又有了select和Epoll

简单的说,就是等箱子那个号先原地下线,上小号做任务,等时间快到了退小号,上原号抢箱子

在这里,玩游戏的人实现了Epoll的功能(在出现阻塞时,先去做别的事情)

——————————————

//epoll就像是航母的主控室,一架飞机挂了(阻塞),调度另外的飞机继续任务,而不要无限的等待

//相当于在一个线程里实现多线程的功能,所需要的就是给每个飞机一个对讲机,你有情况了就报告一下,主控室好根据消息调控~

int epfd = epoll_create(100);// 主控室只需要建造一次

setnonblocking(listen_st); // 设置成非阻塞状态(我们不使用多线程,那么在等待时程序就不动了)

//(比如说一架飞机出去执行任务,挂了,大家死等它回来.....)

epoll_ctl(epfd,EPOLL_CTL_ADD, XXX, &ev); // 主控室控制,加入需要进行控制的设备,

//比如说服务器,比如说多个飞机(客户端)

epoll_ctl(epfd,EPOLL_CTL_ADD, XXX, &ev);  //这个会执行多次

while(1) //由主控室来死循环

{

int nfds = epoll_wait(epfd,events,100,-1);  // 主控室实时监控,收到当前时刻的(有效)消息数量,

//每条消息都对应相应的设备号或飞机编号

for(i = 0; i < nfds; i++) //每个重要消息都一个一个处理

if(events[i].data.fd == listen_st) ... // 服务器消息(例如有客户端连接上来了)

if(events[i].events & EPOLLIN) ....// 侦察机发来消息

if(events[i].events & EPOLLERR)... //侦察机故障

if(events[i].events & EPOLLHUP)...//侦察机被摧毁

 

close(epfd); //程序结束前,关闭主控室

}




0 0