考虑以下示例:
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <signal.h>
#include <thread>
void sleepy() {
usleep(1.0E15);
}
int main() {
std :: thread sleepy_thread(sleepy);
// Wake it up somehow...?
sleepy_thread.join();
}
这里我们有一个永远睡不着的线程。我想加入它,而不必永远等待它自发地从睡眠中醒来。有没有办法从外部告诉它“嘿,醒来!”,以便我可以在合理的时间内加入它?
我绝对不是线程专家,所以如果可能的话,不要假设任何事情。
答案 0 :(得分:2)
“有没有办法从外部告诉它”嘿,醒来!“,以便我可以在合理的时间内加入它?”
不,根据c ++标准机制,没有办法这样做。
好吧,为了让你的线程被唤醒,你需要一种机制让其他线程控制它。除了usleep()
之外,还有一个不推荐使用的POSIX函数:
第6期
更新说明以避免对应用程序要求使用术语“必须”。
此功能已标记为已淘汰。
IEEE Std 1003.1-2001 / Cor 2-2004,应用项目XSH / TC2 / D6 / 144,将描述从“过程'信号掩码”更新为“线程的信号掩码”,并添加{{{ 1}}函数不需要是可重入的。
你无法控制另一个线程,这将会调用该函数
即使从std::thread
声明,任何其他 function add_post_class($classes) {
$tester = strpos($classes,'toefl_post');
$additional = 'post'
if($tester === false) {
// string NOT found
return $classes;
}
else {
// string found
$classes = $classes + $additional;
return $classes;
};
}
add_filter('post_class', 'add_post_class');
函数也是如此。
正如其他答案或评论中所述,您需要使用时间同步机制,如线程函数中的std::timed_mutex
或std::condition_variable
。
答案 1 :(得分:0)
一种可能的方法:(有很多方法可以实现......在你的线程中使用sleep也不是一个好主意)
///Define a mutex
void sleepy()
{
//try to take mutex lock which this thread will get if main thread leaves that
//usleep(1.0E15);
}
int main()
{
//Init the Mutex
//take mutex lock
std :: thread sleepy_thread(sleepy);
//Do your work
//unlock the mutex...This will enable the sleepy thread to run
sleepy_thread.join();
}
答案 2 :(得分:0)
只需使用信号量,拨打sem_timedwait而不是usleep
,并在致电join
之前致电sem_post