1
这是继续问题14221339.epoll是否有线程安全问题?
我有一个在epoll_wait()
循环内运行的线程池。
外部线程调用epoll_ctl()
,并增加了与
(EPOLLET | EPOLLONESHOT | EPOLLIN)
一个监听套接字。
当线程池只有一个线程时,它间歇性地无法接收第一个(也是唯一)连接尝试的EPOLLIN
事件。如果我将线程池增加到两个,它几乎总是无法收到EPOLLIN
事件。
我的理解是,epoll API是线程安全的,但是这个观察似乎表明了其他情况。
我发现这个问题,它实际上已经无关epoll的。我的应用程序是用C++编写的,线程池的创建包含一个带有可变参数和std :: bind的递归模板函数。发生了一些奇怪的竞态条件,其中std :: function对象被清除,所以线程永远不会进入epoll_wait()循环。 – user1715664
很高兴你解决了这个问题! – arayq2
@ arayq2你确定该电话订单吗?我从来没有看到任何epoll相关的顺序调用它们?我有一个类似的问题[这里](http://stackoverflow.com/questions/33885439/epoll-with-edge-triggered-and-oneshot-only-reports-once)。手册页建议,一旦fd被重新启用,如果它能够符合标志的标准,即使在等待之后调用ctl,它也会触发事件。任何额外的信息,你可以给这个将是伟大的:) – nathansizemore