2009-10-22 40 views
19

Estoy desarrollando una aplicación en la que hago multihebra. Uno de mis hilos de trabajo muestra imágenes en el widget. Otro hilo reproduce sonido. Quiero detener/suspender/pausar/suspender los hilos en un evento de clic de botón. Es lo mismo que cuando hacemos clic en el botón reproducción/pausa del reproductor de video. Estoy desarrollando mi aplicación en C++ en la plataforma Linux utilizando la biblioteca pthread para enhebrar.Cómo dormir o pausar un PThread en c en Linux

¿Alguien puede decirme cómo logro los hilos pause/suspend?

Respuesta

29

Puede usar un mutex, una variable de condición y una variable de marcador compartida para hacer esto. Vamos a suponer que éstas se definen a nivel mundial:

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
int play = 0; 

Se podría estructurar el código de la reproducción de esta manera:

for(;;) { /* Playback loop */ 
    pthread_mutex_lock(&lock); 
    while(!play) { /* We're paused */ 
     pthread_cond_wait(&cond, &lock); /* Wait for play signal */ 
    } 
    pthread_mutex_unlock(&lock); 
    /* Continue playback */ 
} 

Entonces, para jugar se puede hacer esto:

pthread_mutex_lock(&lock); 
play = 1; 
pthread_cond_signal(&cond); 
pthread_mutex_unlock(&lock); 

Y para hacer una pausa:

pthread_mutex_lock(&lock); 
play = 0; 
pthread_mutex_unlock(&lock); 
+0

No es realmente seguro acceder alguna vez a una variable compartida globalmente en un entorno de subprocesos múltiples. Bloquee el mutex antes de buscar '! Play' y también use un mutex cuando configure' play = 0; '. En la práctica, esto no será un problema en un solo sistema central, pero siempre es mejor escribir un código correcto/a prueba de futuro. –

+0

En la práctica, tampoco será un problema para la mayoría de los sistemas multi-core, aunque tienes razón, esto necesita al menos un par de barreras de memoria. Sin ellos, la pausa podría tomar un tiempo arbitrariamente largo para surtir efecto. Por supuesto, solo bloquear el mutex también está bien, y editaré esta respuesta para hacer eso. :) – LnxPrgr3

+0

@deft_code ¡Respuesta actualizada! Por favor, mira mi comentario anterior sin embargo. – LnxPrgr3

3

Tiene su encuesta de subprocesos para "mensajes" desde la interfaz de usuario a intervalos regulares. En otras palabras, la interfaz de usuario en un hilo publica mensajes de acción en los hilos de trabajo, p. audio Video.

+2

Esta es probablemente la mejor respuesta aquí. El problema es que es tan delgado en los detalles que realmente no responde la pregunta. –