hi :-),
我说说我的理解吧,epoll() 本来就不是设计给多线程同时调用的,而是一个线程
可以同时处理多个事件源的数据(比如多个网络连接)。
对于多线程,应该是这样使用:
main thread:
n = epoll(...);
for (i = 0; i < n; i++)
new_thread(fds[i]);
收到事件时,开启一个线程去处理对应的 fd。
hi :-),
对于你说的一个客户端发来两个 50 byte 的包,希望放到两个 thread 中处理,
我想,应该是下面这样的结构,才能做到并发处理:
main thread:
n = epoll(...);
for (i = 0; i < n; i++)
read_thread(fds[i]);
read thread:
data = read(fd);
put_into_queue(fd, data);
worker thread:
data = get_data_from_queue();
// do sth.
注解:通过几个 read_thread,将收到的完整的包放入 queue 中,然后几个 work
thread 不停处理 queue 中的数据。
不过上面仅仅是个人的猜想,其实我并没有做过 epoll + thread 的程序结构,我
觉得这类模型更适合 http request 这种两个 request 之间没有相互影响的行为。
而对于 MMO 这样逻辑复杂、交互很多的东西,一般都是:
n = epoll_wait()
for ( i = 0; i < n; i++ )
// do sth.
除了这里用 epoll,其他地方再优化下(比如数据异步存储),基本上单服 5k 应
该可以达到。
这里的处理方法,和后面 flywav 同学说的 nginx 的单线程 5w 链接是一样的。:-)
----
by kasicass
我想,如果程序锁争夺的事件很多,则 cpu 的利用率怎么都高不起来的。
flywav 写道:
>> n = epoll_wait()
>> for ( i = 0; i < n; i++ )
>> // do sth.
>
> 意味着 单线程在运行, 如果这个时候 这个对象和别的线程发生死锁,整个服务器就死掉了。
>
> mmopg 应该很容易出现这样的锁争夺的事件吧。
>
--
Best regards!
Kasicass/汤泽江 <kasicass_at_gmail_dot_com>