2009-10-22 113 views
19

我正在開發一個應用程序,我在其中執行多線程。我的一個工作線程在小部件上顯示圖像。另一個線程播放聲音。我想停止/暫停/暫停/休眠按鈕點擊事件上的線程。這與我們點擊視頻播放器播放/暫停按鈕時相同。 我正在linux平臺上使用pthread庫進行線程開發我的應用程序。如何在Linux上如何睡眠或暫停c中的PThread

有人可以告訴我,我如何實現線程暫停/暫停?

回答

29

您可以使用互斥鎖,條件變量和共享標誌變量來執行此操作。假設這些是全局定義:

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

你可以組織你的播放這樣的代碼:

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

然後,玩你可以這樣做:

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

而暫停:

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

在多線程環境中訪問全局共享變量是不安全的。在檢查'!play'之前鎖定互斥鎖,並在設置'play = 0;'時使用互斥鎖。實際上,這不會成爲單核心繫統的問題,但編寫正確/面向未來的代碼總是更好。 – 2011-01-21 17:55:20

+0

實際上,對於大多數多核系統來說,這也不會成爲問題,儘管你是對的 - 這確實需要至少一些內存障礙。沒有它們,停頓可能需要很長時間才能生效。當然,只需鎖定互斥鎖也行,我將編輯此答案來完成此操作。 :) – LnxPrgr3 2011-01-22 00:59:59

+0

@deft_code回答更新!請參閱我之前的評論。 – LnxPrgr3 2011-01-22 02:17:29

3

你有你的線程定期從UI調查「消息」的UI。換句話說,一個線程中的UI將動作消息發佈到工作者線程,例如,音頻視頻。

+2

這可能是這裏最好的答案。問題在於細節上如此薄弱,以至於它沒有真正回答這個問題。 – 2011-01-21 17:57:55