我希望STL线程在完成它应该做的事情后终止自己;还有,有什么方法可以知道线程何时完成?就像事件一样。
提前致谢。
答案 0 :(得分:2)
线程将在它结束函数f后终止,并且:
void f()
{
do_some_work();
// end of function f
}
...
{
...
std::thread t(f);
do_some_other_work();
t.join();
}
功能join
- >阻止你的当前线程,直到线程t停止。
答案 1 :(得分:2)
如果您想要一种方法来轮询线程的完成状态而不是简单地使用join
阻止,您可以使用async
生成线程并轮询返回的future
由waiting以0超时完成:
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";
}
答案 2 :(得分:1)
此操作称为join
:http://www.cplusplus.com/reference/thread/thread/join/
调用时,当前线程将等待,直到另一个线程完成。就那么简单。没什么。
答案 3 :(得分: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
}
}
但是对于你想独立运行的每个线程使用全局变量并不是很好......