2014-03-18 45 views
1

我尽量让一个超时的C++程序,就像这样:C++多线程块主线程

... 
void ActThreadRun(TimeOut *tRun) 
{ 
    tRun->startRun(); 
} 
    ... 
void otherFunction() 
{ 
TimeOut *tRun = new TimeOut(); 
std::thread t1 (ActThreadRun, tRun); 
t1.join();  

    while(tRun->isTimeoutRUN()) 
    { 
     manageCycles(); 
    } 
} 
    ... 

超时之后3个secondes做的,而tRun->isTimeoutRUN()改变自己的状态。

但是,如果我“join”线程,我阻止此程序,所以这是等待的时间(3秒)继续之前,所以它从来没有在我,而仿羔皮呢去...

但是,如果我不要“join”这个线程,线程永不超时,并且tRun->isTimeoutRUN()永不改变,所以它无限运行。

我不是线程好,所以我问你的帮助,因为我不明白,在这个教程中C++

泰!

+0

尝试添加while循环内存屏障。编译器可以将值放入寄存器 – thisisdog

回答

3

您可以使用新的C++ 11的设施

// thread example 
#include <iostream>  // std::cout 
#include <thread>   // std::thread 

void sleep() 
{ 
    std::chrono::milliseconds dura(2000); 
    std::this_thread::sleep_for(dura);//this makes this thread sleep for 2s 
} 

int main() 
{ 
     std::thread timer(sleep);// launches the timer 
     int a=2;//this dummy instruction can be executed even if the timer thread did not finish 
     timer.join();   // wait unil timer finishes, ie until the sleep function is done 
     std::cout<<"Time expired!"; 
     return 0; 
} 

希望帮助

+0

但是我必须在连接和std :: cout之间做一些事情,一个While循环,其中break是一个方法调用在我的线程中... – F4Ke

+0

如果你有东西做之前加入和cout <<“时间过期!”然后将它添加到睡眠函数中,在std :: this_thread :: sleep_for(dura)之后; //这使得该线程睡眠2s。那么你会:启动线程,运行计时器,做你想做的事情,然后打印cout。这能解决你的问题吗? – Gabriel

+0

我想要做的线程只是我的程序的一段时间。所以我可以这样做,当timeOut在这里时,它会停止循环。但是,当我打电话加入它总是阻止主线程,所以我不能继续工作,即使你的方法 – F4Ke