2009-10-22 13 views
19

Sto sviluppando un'applicazione in cui eseguo il multithreading. Uno dei miei thread di lavoro mostra le immagini sul widget. Un altro thread suona il suono. Voglio interrompere/sospendere/mettere in pausa/sospendere i thread su un evento click del pulsante. È come quando clicchiamo sul pulsante play/pause del lettore video. Sto sviluppando la mia applicazione in C++ su piattaforma linux usando la libreria pthread per il threading.Come dormire o mettere in pausa un PThread in c su Linux

Qualcuno può dirmi come riesco a interrompere i thread/sospendere?

risposta

29

È possibile utilizzare una variabile di condizione mutex, e una variabile di flag condivisa per eseguire questa operazione. Supponiamo che questi sono definiti a livello globale:

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

Si potrebbe strutturare il codice di riproduzione in questo modo:

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 */ 
} 

Poi, per giocare si può fare questo:

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

E per mettere in pausa:

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

Non è davvero sicuro accedere mai a una variabile condivisa a livello globale in un ambiente multi-thread. Blocca il mutex prima di cercare "! Play" e usa anche un mutex quando imposti 'play = 0;'. In pratica questo non sarà un problema su un sistema single core, ma è sempre meglio scrivere codice corretto/a prova di futuro. –

+0

In pratica non sarà un problema per la maggior parte dei sistemi multi-core, anche se hai ragione: questo richiede almeno un paio di barriere di memoria. Senza di loro, la pausa potrebbe richiedere un tempo arbitrariamente lungo per avere effetto. Certo, basta bloccare anche il mutex e modificheremo questa risposta per farlo. :) – LnxPrgr3

+0

@deft_code Risposta aggiornata! Si prega di vedere il mio commento precedente però. – LnxPrgr3

3

È possibile eseguire il polling dei thread per "messaggi" dall'interfaccia utente a intervalli regolari. In altre parole, l'interfaccia utente in una discussione pubblica messaggi di azione sui thread di lavoro, ad es. audio video.

+2

Questa è probabilmente la migliore risposta qui. Il problema è che i dettagli sono così sottili che in realtà non risponde alla domanda. –

Problemi correlati