我正在开发一个应用程序,我在其中执行多线程。我的一个工作线程在小部件上显示图像。另一个线程播放声音。我想停止/暂停/暂停/休眠按钮点击事件上的线程。这与我们点击视频播放器播放/暂停按钮时相同。 我正在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