主线程,之外开了两个工作线程,循环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,可是运行两步就自己运行起来了。。。
也是新接触,自己摸索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过..有哪位大牛试验过?这种想法有什么问题不,别误导别人了..