【问题标题】:How to sleep or pause a PThread in c on Linux如何在 Linux 上的 c 中休眠或暂停 PThread
【发布时间】:2010-12-09 01:10:48
【问题描述】:

我正在开发一个执行多线程的应用程序。我的一个工作线程在小部件上显示图像。另一个线程播放声音。我想在按钮单击事件上停止/暂停/暂停/休眠线程。与单击视频播放器播放/暂停按钮时相同。 我正在使用 pthread 库在 linux 平台上开发我的应用程序。

谁能告诉我如何实现线程暂停/暂停?

【问题讨论】:

标签: c++ c pthreads


【解决方案1】:

您的线程会定期从 UI 轮询“消息”。换句话说,一个线程中的 UI 将操作消息发布到工作线程,例如音频/视频。

【讨论】:

  • 这可能是这里最好的答案。问题是它的细节太少了,它并没有真正回答这个问题。
【解决方案2】:

您可以使用互斥体、条件变量和共享标志变量来执行此操作。假设这些是全局定义的:

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);

【讨论】:

  • 在多线程环境中访问全局共享变量并不安全。在检查!play 之前锁定互斥锁,并在设置play = 0; 时使用互斥锁。在实践中,这在单核系统上不是问题,但编写正确/面向未来的代码总是更好。
  • 实际上,对于大多数多核系统来说,这也不是问题,尽管您是对的——这确实需要至少几个内存屏障。没有它们,暂停可能需要任意长的时间才能生效。当然,只需锁定互斥锁也可以,我将编辑这个答案来做到这一点。 :)
  • @deft_code 答案已更新!不过请看我之前的评论。
  • 有关更多信息,请参阅此问题和答案:stackoverflow.com/questions/1003190/… ... 简而言之,您必须将互斥锁锁定在 pthread_cond_wait() 周围,建议在 pthread_cond_signal( )。
  • @Ben 你不能依赖它。 pthread_cond_wait 可以在信号发送之前唤醒。您必须重新检查条件。见:pubs.opengroup.org/onlinepubs/7908799/xsh/…
猜你喜欢
  • 1970-01-01
  • 2017-05-07
  • 2011-11-22
  • 2013-09-16
  • 2012-08-15
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多