什么在线程处于睡眠状态时使用pthread_join,pthread_exit或pthread_cancel需要优雅地关闭?

时间:2015-08-01 12:46:07

标签: c linux pthreads sleep

我有一个线程在有条件的情况下运行,它有2分钟的睡眠时间。 (即

while (condition) {
      //do something
      sleep(120);
   }

为了优雅地终止线程,我使用pthread_join()并将设为条件为假(例如someflag = 0

它正在努力终止线程,但是如果线程正在休眠,它就不会终止直到它完成睡眠。

这是我需要避免的问题;我需要让线程尽早出现,即使它处于睡眠状态。

2 个答案:

答案 0 :(得分:5)

以上都不是。您应该使用条件变量而不是while (condition) sleep(120);

while (condition) {
    ...
    pthread_cond_timedwait(&condvar, &mutex, &abstime);
    ...
}

我选择pthread_cond_timedwait假设您实际上需要每120秒唤醒一次,即使没有人发出信号,但如果没有,您可以只使用pthread_cond_wait。更改pthread_cond_signal(&condvar)后,信令线程需要调用condition,当然condition对状态的所有访问(读取和写入)取决于需要由互斥锁保护mutex。 {1}}。您必须在调用pthread_cond_[timed]wait时按住互斥锁。如果您对如何使用条件变量有进一步的疑问,请搜索现有的问题/答案(有很多)或要求跟进。

答案 1 :(得分:2)

这可能不是正确的答案,但是我可以建议将sleep() 120秒分解为更短的时间,例如2秒,并将其置于循环中。每次循环执行时,您都可以检查条件,例如

while (condition)
{
  //do something

  int i = 0;
  while(condition && (60 > i))
  {
    sleep (2);
    i++;
  }
}

我希望有人肯定会贴上更好的答案。

相关问题