2014-02-09 183 views
0

我想要一个STL线程在完成它应该做的事情后自行终止;另外,有什么方法可以知道线程何时完成?就像一个事件左右。自动终止C++ 11 STL线程

在此先感谢。

回答

2

如果你想办法轮询线程的完成状态,而不是简单地用join阻止,你可以用async用0超时产卵你的线程和轮询完成返回future通过waiting

void f() { 
    std::this_thread::sleep_for(std::chrono::seconds{2}); 
} 

int main() { 
    auto const zero = std::chrono::seconds{0}; 
    auto result = std::async(std::launch::async, f); 
    while (result.wait_for(zero) != std::future_status::ready) { 
    std::cout << "I'm still waiting...\n" << std::flush; 
    std::this_thread::sleep_for(std::chrono::milliseconds{100}); 
    } 
    result.get(); 
    std::cout << "Done.\n"; 
} 
+0

这正是我一直在寻找的。谢谢。 –

1

的操作称为joinhttp://www.cplusplus.com/reference/thread/thread/join/

调用时,当前线程将等待,直到其他线程结束。就那么简单。而已。直到线程t停止>块的当前的话题 -

void f() 
{ 
    do_some_work(); 
    // end of function f 
} 

... 
{ 
    ... 
    std::thread t(f); 
    do_some_other_work(); 
    t.join(); 
} 

功能join

+0

我想有一个C#一样是havior,我的意思是,如果我使用'join',执行将会停止,直到线程完成,我希望代码的其他部分在那段时间内继续运行。 –

+0

您只能通过两种方式获得它:消息队列+消息处理器或更多线程,在睡眠时运行其他作业。即使在C#中也是这样的,因为从字面上看,没有其他方法可以做到这一点。如果您不相信,请阅读C#中的“调度程序”和“默认线程池”。在这里,最简单的方法是运行三个线程:一个用于“其他任务”,一个用于“将在某个时间点结束的线程”,另一个用于“等待第二个线程结束”。这就是'线程池'的方式。 – quetzalcoatl

+0

或者,如果您有**任何**消息队列,则可以在第二个线程结束之前将消息从第二个线程发送到队列。消息处理器会注意到该消息并完成。这是'调度员'的方式。 – quetzalcoatl

2

线程wiil来终止它得到函数f结束后,和。

1

像svetlovva和quetzalcoatl说:使用连接操作,以确保线程完成。

但是如果你想知道线程何时完成,而不使用阻塞连接操作,你可以分离线程并使用一些全局变量来检查线程是否存在。 伪代码:

std::atomic<bool> imdone; 

void myThreadfunction() { 
    //dosomestuff; 
    imdone = true; 
    return; 
} 

int main() { 
    imdone = false; 
    std::thread t1(myThreadfunction); 
    t1.detach(); 

    //dosomeotherstuff 

    while(!imdone) { 
     //dosomeotherstuffwhilethreadisrunning 
    } 
} 

但是,这并不是非常好的使用全局变量为要独立运行每个线程...