2009-05-27 16 views
5

¿Hay alguna manera recomendada de esperar en varias entradas? Por ejemplo, me gustaría que mi programa pueda recibir información de 3 fuentes:Esperando en varios eventos C++

Escuche una condición de hilo, p. pthread_cond_wait()

Tome los datos de la entrada Estándar, p. getline()

Escuche en un socket, p. accept()

¿Cuál es la mejor manera de lograr esto? ¿Necesito un hilo para cada fuente de entrada diferente? Gracias

+0

Sí, la razón de esto es probablemente innecesaria. Debería tener el hilo principal esperando solo en la condición. Una hebra de "entrada externa" usando select() para esperar en el socket y entrada de archivo. Entonces, ambos subprocesos hijo y el subproceso "entrada externa" pueden estimular el subproceso principal utilizando la condición. –

Respuesta

4

Puede escuchar múltiples descriptores de archivos sin utilizar múltiples hilos usando la llamada al sistema select(2). Puede usar pthread_cond_timedwait para esperar en una variable de condición con un tiempo de espera excedido, de manera que no espere más de un determinado período de tiempo.

Creo que es muy inusual querer esperar simultáneamente una variable de condición o un descriptor de archivo de algún tipo; si está absolutamente seguro de que eso es lo que quiere hacer, tendrá que usar varios hilos , con un hilo llamando a pthread_cond_wait/pthread_cond_timedwait, y el otro hilo llamando al select o alguna otra función de E/S.

+8

Es inusual porque no puedes hacer esto (fácilmente) en unixes. Es muy común en win32, donde esperar en múltiples cosas (manejadores de socket, colas de hilos, semáforos, etc.) es una obviedad. – nos

0

Parece ciertamente que estas tres opciones de mensajes diferentes son mutuamente excluyentes para un único hilo; ¿Cómo puede leer un solo hilo desde stdin mientras espera una condición de hebra?

Si realmente no desea engendrar tres hilos, la única opción que puedo comprender es de alguna manera modificar o parametrizar las bibliotecas de hilos, corrientes y sockets para tomar una referencia a un objeto de sincronización.

7

No hay necesidad de hilos separados esperando accept(2) y stdin - use poll/select aquí. En lugar de variable condicional, cree un conducto entre hilos (ya tiene hilos si hablamos de CV), espere en el mismo poll y escríbalo cuando ocurra el evento.

3

En Linux moderno, la mejor manera de hacerlo es no utilizar pthread_cond_wait en absoluto. Simplemente use eventfd, que le permitirá escuchar eventos múltiples utilizando select/poll/epoll.