2009-10-22 117 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