我有一个线程在有条件的情况下运行,它有2分钟的睡眠时间。 (即
while (condition) {
//do something
sleep(120);
}
)
为了优雅地终止线程,我使用pthread_join()
并将设为条件为假(例如someflag = 0
)
它正在努力终止线程,但是如果线程正在休眠,它就不会终止直到它完成睡眠。
这是我需要避免的问题;我需要让线程尽早出现,即使它处于睡眠状态。
答案 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++;
}
}
我希望有人肯定会贴上更好的答案。