La llamada al sistema de selección es una forma de esperar a que los descriptores de archivos cambien de estado mientras que los programas no tienen nada más que hacer. El uso principal es para aplicaciones de servidor, que abren una gran cantidad de descriptores de archivos y luego esperan que ocurra algo sobre ellos (acepte nuevas conexiones, lea solicitudes o envíe las respuestas). Esos descriptores de archivos se abrirán en modo no bloqueante, de modo que el proceso del servidor no se bloqueará en un syscall en ningún momento.
Esto significa, además, que no hay necesidad de hilos separados, porque todo el trabajo que se podría hacer en el hilo también se puede hacer antes de la llamada de selección. Y si el trabajo lleva mucho tiempo, que puede ser interrumpido, seleccione ser llamado con timeout = {0,0}, se manejan los descriptores de archivo y luego se reanuda el trabajo.
Ahora, cierra un descriptor de archivo en otro hilo. ¿Por qué tiene ese hilo adicional y por qué cerrará el descriptor del archivo?
estándar POSIX no proporciona ninguna pista, lo que sucede en este caso, por lo que lo que está haciendo es un comportamiento indefinido. Espere que el resultado sea muy diferente entre diferentes sistemas operativos e incluso entre versiones del mismo sistema operativo.
Saludos, Bodo
Posible duplicado de [ruptura de selección de socket] (http://stackoverflow.com/questions/2486727/breaking-out-from-socket-select) – iammilind
Creo que es diferente, aunque ligeramente relacionado. La otra pregunta es preguntar explícitamente cómo salir de un 'select()' de otro hilo (y 'pipe()' es una buena respuesta), mientras que el mío era más sobre el comportamiento de 'close()' en un 'select () 'conector ed. En las respuestas a continuación, verá que la respuesta es "depende". –
Una de las búsquedas de errores más misteriosas que surgió se debió a este problema: el hilo A estaba seleccionando en el socket #x, que el hilo B cerró. Poco después, el subproceso C creó un nuevo socket, que también resultó ser el socket #x (porque la pila de red eligió reutilizar el número x para el nuevo socket). En este punto, el hilo A (que todavía estaba tratando de usar el socket #x), por supuesto, comenzó a seleccionar/leer/escribir datos en el socket de la rosca C, a pesar de que no tenían absolutamente ninguna conexión lógica entre sí. Este fue un dolor total para rastrear. –