linux中的多线程epoll问题

linux中的多线程epoll问题,linux,multithreading,epoll,Linux,Multithreading,Epoll,我有一个使用epoll(7)的多线程linux程序。epoll(7)手册页显示,当其一个fd关闭时,该fd将自动从epoll集合中删除。我的问题是,如果epoll集的fd在一个线程中关闭,而epoll集在另一个线程中被并发轮询,而没有同步,该怎么办。程序是否会损坏,或者内核是否会自动同步此访问 谢谢 Fengepoll集中的FD由内核维护,因此您是安全的-内核处理任何必要的同步 也就是说,fd上的事件有可能在fd关闭之前进入另一个线程。因此,可能有来自fd的事件不再出现在集合中。使用精心设计的程

我有一个使用epoll(7)的多线程linux程序。epoll(7)手册页显示,当其一个fd关闭时,该fd将自动从epoll集合中删除。我的问题是,如果epoll集的fd在一个线程中关闭,而epoll集在另一个线程中被并发轮询,而没有同步,该怎么办。程序是否会损坏,或者内核是否会自动同步此访问

谢谢


Feng

epoll集中的FD由内核维护,因此您是安全的-内核处理任何必要的同步


也就是说,fd上的事件有可能在fd关闭之前进入另一个线程。因此,可能有来自fd的事件不再出现在集合中。使用精心设计的程序,这应该不会导致问题。

+1 FWIW在我的linux 2.6测试盒上,在管道被epoll_wait()加载时关闭管道的读取fd()会自动从轮询集中删除fd。因此,最坏的情况是,如果epoll_wait()是不确定的,并且close()d fd是唯一的fd或唯一保证唤醒进程的fd,那么您可能会永远挂起。