2011-08-19 6 views
5

Hay varios subprocesos trabajando en una tarea. Una vez que un hilo tiene éxito, se debe cancelar todo el hilo, a medida que se realiza el trabajo. ¿Cómo puedo cancelar los otros hilos una vez que un hilo ha terminado con éxito? ¿Quién llamará al pthread_cancel() y cómo indicará el hilo exitoso main o el hilo que lo engendró (valor de retorno?).Cancelar el hilo POSIX después de realizar un trabajo en común

ACTUALIZACIÓN

no quiero llamar simplemente exit como yo quiero ahora algún tipo de control. Por ejemplo, después de que los hilos se cancelan, procesaré el resultado encontrado por el hilo exitoso y posiblemente haga un poco más de procesamiento, o simplemente quiero mantener el proceso en funcionamiento para un poco más de trabajo.

+0

¿Por qué necesita varios hilos para esta tarea, si va a descartar el trabajo realizado por todos menos uno? Solo haz el trabajo una vez en un hilo. – zwol

+2

decir, tengo una gran lista para buscar linealmente, pasaré segmentos de listas a diferentes hilos, y una vez que encuentre una coincidencia, regresa. otros son cancelados – phoxis

+0

Supongo que tiene sentido en un contexto en el que la búsqueda de fuerza bruta es la única opción, pero si tiene alguna estructura en sus datos, hay mejores algoritmos. – zwol

Respuesta

4

Puedes elegir un esquema simple donde main hace de todo.

Tenga main inicie todos los hilos y haga un down en algún semáforo. Cuando un hilo termina la tarea, haz un up en ese semáforo. Cuando main está desbloqueado, puede pthread_cancel todos los hilos (y luego pthread_join para asegurarse).

De esta manera main inicia y detiene todos los hilos, por lo que debería ser bastante simple.

+0

sí, mi diseño es de base principal y esta es una buena idea. ¿Se puede hacer algo con señales? – phoxis

+0

@phoxis Para estar seguro, puede enviar una señal a un hilo usando 'pthread_kill'. Aún en esta regla, creo que sería complicado (no puedo pensar en una forma fácil de dejar el hilo de un manejador de señal). Pero no confíe en mi palabra, siempre evito las señales. – cnicutar

+0

en el caso de niños desovantes principales, me gusta la solución mutex, y la usaré. Pregunté sobre señales cuando es el caso de que los hilos se generan de forma recursiva o aleatoria sin un elemento primario común, en ese caso las señales podrían funcionar. ¿O hay otra forma de manejar la cancelación de tal desove aleatorio? – phoxis

1

Una forma simple es llamar al exit() que finaliza el proceso junto con todos los hilos. Se puede invocar desde cualquier hilo.

Otra forma es hacer que su engendro hilo principal y esperar en los subprocesos de trabajo, y una vez que uno de los subprocesos de trabajo se ha completado, ya sea:

  • dicen Nicely los otros hilos para terminar y esperar hasta que lo hacen, o
  • abruptamente pthread_cancel() ellos. Por defecto, los subprocesos se crean con PTHREAD_CANCEL_DEFERRED, lo que significa que no finalizarán hasta que llamen a cualquiera de las funciones del punto de cancelación; ver Thread Cancellation para una buena descripción. Por lo tanto, si los subprocesos realizan cálculos largos, es posible que desee establecer su estado de cancelación en PTHREAD_CANCEL_ASYNCHRONOUS para finalizar el subproceso de inmediato, consulte pthread_setcanceltype.
+0

sí, esa es una forma que estaba usando hasta antes de publicar esto, pero ahora quiero un poco más de control. Por ejemplo, después de que los hilos se cancelan, procesaré el resultado encontrado por el hilo exitoso y posiblemente haga un poco más de procesamiento. – phoxis

+0

vea la actualización a continuación :) –

+0

¿Se puede hacer cualquier cosa con las señales? – phoxis

Cuestiones relacionadas