2011-05-17 20 views
7

Tengo un programa de varios hilos de Linux que usa epoll (7). La página man de epoll (7) dice que cuando se cierra uno de sus fds, este fd se eliminará automáticamente del conjunto epoll. Mi pregunta es qué pasa si un archivo fd del conjunto epoll se cierra en un hilo mientras el conjunto epoll se está sondeando en otro hilo al mismo tiempo sin sincronización. ¿Se dañará el programa o el kernel sincronizará este acceso automáticamente?Un problema de epoll multiproceso en Linux

Gracias

Feng

Respuesta

7

el FDS en un conjunto epoll son mantenidos por el kernel, por lo que es seguro - el kernel maneja cualquier sincronización necesaria.

Dicho esto, existe la posibilidad de que un evento en el fd entre en el otro subproceso justo antes de que el fd se cierre. Por lo tanto, podría ser posible tener un evento de un fd que ya no parece estar en el conjunto. Con un programa cuidadosamente diseñado, esto no debería causar un problema.

+0

+1 FWIW en mi cuadro de prueba de linux 2.6, cierre() el fd de lectura de un conducto mientras está siendo epoll_wait() ed parece eliminar silenciosamente el fd del conjunto de sondeo. Por lo tanto, en el peor de los casos, si epoll_wait() es indefinido y close() d fd fue el único fd o el único que garantiza que se activará el proceso, es posible que se cuelgue para siempre. – pilcrow