2009-10-22 6 views
19

Zajmuję się tworzeniem aplikacji, w której robię wielowątkowość. Jeden z moich wątków roboczych wyświetla obrazy na widżecie. Kolejny wątek odtwarza dźwięk. Chcę zatrzymać/zawiesić/wstrzymać/uśpić wątki w zdarzeniu kliknięcia przycisku. Jest taki sam, jak po kliknięciu przycisku odtwarzania/pauzy odtwarzacza wideo. Pracuję nad aplikacją w języku C++ na platformie linuksowej przy użyciu biblioteki pthread do gwintowania.Jak się przespać lub zatrzymać PThread in c na Linuksie

Czy ktoś może mi powiedzieć, w jaki sposób osiągam wątki wstrzymać/zawiesić?

Odpowiedz

29

W tym celu można użyć zmiennej mutex, warunku i zmiennej współdzielonej flagi. Załóżmy, że są one zdefiniowane globalnie:

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

Można zorganizować swój kod odtwarzania tak:

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

Następnie grać można to zrobić:

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

A, aby wstrzymać:

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

Nie jest nigdy bezpiecznie uzyskać dostęp do globalnie udostępnianej zmiennej w środowisku wielowątkowym. Zablokuj muteks przed sprawdzeniem '! Play', a także użyj muteksu podczas ustawiania' play = 0; '. W praktyce nie będzie to problemem dla pojedynczego systemu, ale zawsze lepiej jest napisać poprawny/przyszłościowy kod. –

+0

W praktyce nie będzie to problemem dla większości systemów wielordzeniowych, ale masz rację - to wymaga przynajmniej kilku barier pamięci. Bez nich przerwa może trwać dość długo, aby uzyskać efekt. Oczywiście samo blokowanie muteksa też jest w porządku, a ja zmienię tę odpowiedź, by to zrobić. :) – LnxPrgr3

+0

@deft_code Odpowiedź zaktualizowana! Proszę jednak zobaczyć mój poprzedni komentarz. – LnxPrgr3

3

Masz wątki odpytywać za "wiadomości" z interfejsu w regularnych odstępach czasu. Innymi słowy, interfejs użytkownika w jednym wątku wysyła komunikaty o działaniu do wątków roboczych, np. audio Video.

+2

To chyba najlepsza odpowiedź tutaj. Problem polega na tym, że jest tak cienki w szczegółach, że tak naprawdę nie odpowiada na pytanie. –