Pregunta

Estoy leyendo los datos desde múltiples puertos serie.En la actualidad estoy usando una costumbre manejador de señal (mediante el establecimiento de sa_handler) para comparar y despertar hilos basada en el archivo descriptor de la información.Yo estaba buscando una manera de salir los hilos con una única señal de los controladores, en este sentido, me encontré con que seleccione llamada de sistema va a ser utilizado.

Ahora tengo las siguientes preguntas:

  1. Si estoy usando un hilo (Qt), entonces ¿dónde colocar el sistema de selección de llamadas para controlar el puerto serie?
  2. Es el sistema de selección de llamadas hilo seguro?
  3. Es la CPU, porque hay muchas cosas que están sucediendo en mi aplicación, incluyendo GUI actualización?

Por favor, no la mente, si usted encuentra estas preguntas ridículas.Nunca he utilizado este mecanismo para la comunicación en serie.

¿Fue útil?

Solución

El Especificación POSIX (seleccione) es el lugar para buscar la select definición.Yo personalmente lo recomiendo poll - tiene una mejor interfaz y puede manejar cualquier número de descriptores, en lugar de un sistema definido por el límite.

Si entiendo correctamente, usted se está despertando hilos basada en el estado de ciertos descriptores.Una mejor manera sería que cada hilo tiene su propio descriptor y seleccionar una llamada a sí mismo.Se puede ver, seleccione no modifica el estado del sistema, y siempre que el uso local de subprocesos variables que va a ser seguro.Sin embargo, usted definitivamente quiere asegurarse de que usted no cierre un descriptor que un hilo depende.

El uso de select/poll con un tiempo de espera de las hojas de la "espera" hasta el núcleo, lo que hace que el hilo se suelen poner a dormir.Mientras que el hilo es para dormir es no usar ninguna de tiempo de CPU.De un tiempo/bucle for en un select llame sin un tiempo de espera en el otro lado le dará un mayor uso de la CPU como usted está constantemente girando en el bucle.

Espero que esto ayude.

EDITAR:También, select/poll puede tener resultados impredecibles cuando se trabaja con el mismo descriptor en varios subprocesos.La sencilla razón de esto es que el primer hilo podría ser despertado el descriptor está listo para la lectura, pero el segundo hilo tiene que esperar para la siguiente "disponible para la lectura de" el despertador.

Mientras no estás selecting en el mismo descriptor en varios subprocesos que usted no debe tener un problema.

Otros consejos

Es una llamada al sistema; creo que debería ser seguro para subprocesos.

No hice esto antes, pero estaría bastante sorprendido, si no fuera así. El uso intensivo de la CPU select() depende, en mi opinión, en gran medida del número de identificadores de archivos que está esperando. <=> se usa principalmente para esperar a que esté listo un número (> 1) de identificadores de archivos.

También debe mencionarse que <=> no debe usarse para sondear los identificadores de archivos, por razones de rendimiento. El uso normal es: tiene su trabajo hecho y puede pasar algún tiempo hasta que suceda lo siguiente. Ahora suspende su proceso con select y deja que se ejecute otro proceso. <=> normalmente suspende el proceso activo. ¡Cómo funciona esto junto con hilos, no estoy seguro! Creo que todo el proceso (y todos los hilos) están suspendidos. Pero esto podría estar documentado. También podría depender (en Linux) si usa hilos de sistema o hilos de usuario. El núcleo no conocerá los subprocesos de usuario y, por lo tanto, suspenderá todo el proceso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top