从usleep唤醒std :: thread

时间:2015-08-26 17:30:09

标签: c++ multithreading

考虑以下示例:

#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();
}

这里我们有一个永远睡不着的线程。我想加入它,而不必永远等待它自发地从睡眠中醒来。有没有办法从外部告诉它“嘿,醒来!”,以便我可以在合理的时间内加入它?

我绝对不是线程专家,所以如果可能的话,不要假设任何事情。

3 个答案:

答案 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_mutexstd::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