当前位置: 技术问答>linux和unix
在多线程中使用select
来源: 互联网 发布时间:2015-07-03
本文导语: 因为用select来检测socket有点慢。 于是采用多线程来提高效率。在每个线程中都使用select来轮询对应的不同的socket. 而这些线程的socket是通过主程序取得放在队列中。然后每个线程去查对应的队列。来向 select里添加soc...
因为用select来检测socket有点慢。
于是采用多线程来提高效率。在每个线程中都使用select来轮询对应的不同的socket.
而这些线程的socket是通过主程序取得放在队列中。然后每个线程去查对应的队列。来向
select里添加socket.
但是这样的程序不稳定,有时,会挂起。也就是我主程序收到了一个accept。然后往队列里写sokcet值了。但是没有线程去读。线程挂起了。
我觉得不是select阻塞了,就是FD_ISSET阻了。
问一下,为什么会阻塞呢。因为select中我设置的是0.也就是不阻塞。
怎么解决这个问题呢。
谢啦
于是采用多线程来提高效率。在每个线程中都使用select来轮询对应的不同的socket.
而这些线程的socket是通过主程序取得放在队列中。然后每个线程去查对应的队列。来向
select里添加socket.
但是这样的程序不稳定,有时,会挂起。也就是我主程序收到了一个accept。然后往队列里写sokcet值了。但是没有线程去读。线程挂起了。
我觉得不是select阻塞了,就是FD_ISSET阻了。
问一下,为什么会阻塞呢。因为select中我设置的是0.也就是不阻塞。
怎么解决这个问题呢。
谢啦
|
如果是多个线程主动去读的话,检查下队列的上锁解锁机制是否正确,很多情况下可能是锁没有被正确释放导致线程抢到锁而挂起;
|
一个线程对应一个队列??能详细解释下吗?
|
把代码贴出来,也好让大家明白些
|
有简单的方法就是:一个线程负责所有的select,另外一个线程负责所有的accept