我正在開發一個應用程序,我在其中執行多線程。我的一個工作線程在小部件上顯示圖像。另一個線程播放聲音。我想停止/暫停/暫停/休眠按鈕點擊事件上的線程。這與我們點擊視頻播放器播放/暫停按鈕時相同。 我正在linux平臺上使用pthread庫進行線程開發我的應用程序。如何在Linux上如何睡眠或暫停c中的PThread
有人可以告訴我,我如何實現線程暫停/暫停?
我正在開發一個應用程序,我在其中執行多線程。我的一個工作線程在小部件上顯示圖像。另一個線程播放聲音。我想停止/暫停/暫停/休眠按鈕點擊事件上的線程。這與我們點擊視頻播放器播放/暫停按鈕時相同。 我正在linux平臺上使用pthread庫進行線程開發我的應用程序。如何在Linux上如何睡眠或暫停c中的PThread
有人可以告訴我,我如何實現線程暫停/暫停?
您可以使用互斥鎖,條件變量和共享標誌變量來執行此操作。假設這些是全局定義:
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);
你有你的線程定期從UI調查「消息」的UI。換句話說,一個線程中的UI將動作消息發佈到工作者線程,例如,音頻視頻。
這可能是這裏最好的答案。問題在於細節上如此薄弱,以至於它沒有真正回答這個問題。 – 2011-01-21 17:57:55
在多線程環境中訪問全局共享變量是不安全的。在檢查'!play'之前鎖定互斥鎖,並在設置'play = 0;'時使用互斥鎖。實際上,這不會成爲單核心繫統的問題,但編寫正確/面向未來的代碼總是更好。 – 2011-01-21 17:55:20
實際上,對於大多數多核系統來說,這也不會成爲問題,儘管你是對的 - 這確實需要至少一些內存障礙。沒有它們,停頓可能需要很長時間才能生效。當然,只需鎖定互斥鎖也行,我將編輯此答案來完成此操作。 :) – LnxPrgr3 2011-01-22 00:59:59
@deft_code回答更新!請參閱我之前的評論。 – LnxPrgr3 2011-01-22 02:17:29