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

sha*_*kil 1 c linux sleep pthreads

我有一个线程在条件下运行,它有2分钟的睡眠.(即

while (condition) {
      //do something
      sleep(120);
   }
Run Code Online (Sandbox Code Playgroud)

)

为了优雅地终止线程,我在条件为false时使用pthread_join()并制作(例如)someflag = 0

它的工作是终止线程,但是如果线程处于休眠状态,它就会在完成休眠之后终止.

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

R..*_*R.. 5

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

while (condition) {
    ...
    pthread_cond_timedwait(&condvar, &mutex, &abstime);
    ...
}
Run Code Online (Sandbox Code Playgroud)

我选择pthread_cond_timedwait假设你实际上需要醒来并且每120秒做一次事情,即使没有人发信号通知你,但如果没有,你可以pthread_cond_wait改用.信号线程pthread_cond_signal(&condvar)在更改之后需要调用condition,当然所有对状态的访问(读取和写入)都condition需要由互斥锁保护,mutex.你必须在呼叫时持有互斥锁pthread_cond_[timed]wait.如果您对如何使用条件变量有进一步的疑问,请搜索现有的问题/答案(有很多)或询问后续行动.