首页 新闻 会员 周边

请教下: epoll_wait 多线程时的一些问题

0
[待解决问题]


主线程,之外开了两个工作线程,循环epoll_wait,加入一个客户端已接入,先发了条消息"a",线程2的epoll_wait执 行下去,在收这条消息的时候,客户端发了条消息"b",此时加入线程3恰巧被分配到时间运行,此时线程3的epoll_wait可否执行下去?
1.线程2执行完读取“a”,线程3的wait才会被唤醒,去读取消息“b”吗?
2.线程3就不会被唤醒?线程2必须完成两条消息的读取操作?

刚去接触linux和epoll。。自己简单调试了下,gdb也是刚用,线程中都在wait后面打上断点,先发一条消息过去后,一条线程的断点断下来了,然后客户端再发来一条,另条线程的断点还是断下来了,然后n,可是运行两步就自己运行起来了。。。

莫铭的主页 莫铭 | 菜鸟二级 | 园豆:204
提问于:2012-09-29 15:45
< >
分享
所有回答(1)
1

也是新接触,自己摸索google一些资料,最终采用这种方法:

epoll_event sockEvt;
lisEvent.events = EPOLLONESHOT | ....;

让其触发一次,就从wait队列中去除.如果不使用ONESHOT从wait队列中去除,应该会出现第一个处理线程在处理a消息时,b消息来到,第二条线程被唤醒处理b消息.

如果你就是想要两条线程一起处理先后来到的同一个socket消息的话,就不用加ONESHOT了.

至于socket.recv是不是线程安全的就不知道了...google的结果好像大都说是线程安全的.不过我还是使用了ONESHOT.

读取的时候可以循环读取,直到收到错误码EAGAIN,然后数据读取完毕.

多线程调试比较蛋疼...应该有frozen一些指令吧,将线程暂时冰冻不运行,可以试验下.help或者Google一下看看具体的线程冻结指令.然后就可以只调试一个线程了.其实一直都想自己试试的,过于懒惰,主线程,两个工作线程,frozen主线程和一个已经被唤醒的工作线程,然后客户端再发送一个消息b,看看第二个工作线程是不是会被唤醒,然后第二个工作线程跟踪完毕,看看recv b消息后,再将第一个工作线程唤醒,原先第一个工作线程读取a消息后,准备循环读取的时候给冻结,然后b消息被第二个线程读取后,再唤醒第一个线程,看起读取的是不是EAGAIN.如果一切ok,那么就是逻辑代码中的消息队列是不是加锁push进去的.

只是意淫出来的.虽然已经用这个方法写出来的服务器运行没有啥问题,但是这个细节还没像上面想的那么细的step过..有哪位大牛试验过?这种想法有什么问题不,别误导别人了..

莫铭 | 园豆:204 (菜鸟二级) | 2013-04-09 12:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册