回答
如果你想办法轮询线程的完成状态,而不是简单地用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";
}
的操作称为join
:http://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
:
我想有一个C#一样是havior,我的意思是,如果我使用'join',执行将会停止,直到线程完成,我希望代码的其他部分在那段时间内继续运行。 –
您只能通过两种方式获得它:消息队列+消息处理器或更多线程,在睡眠时运行其他作业。即使在C#中也是这样的,因为从字面上看,没有其他方法可以做到这一点。如果您不相信,请阅读C#中的“调度程序”和“默认线程池”。在这里,最简单的方法是运行三个线程:一个用于“其他任务”,一个用于“将在某个时间点结束的线程”,另一个用于“等待第二个线程结束”。这就是'线程池'的方式。 – quetzalcoatl
或者,如果您有**任何**消息队列,则可以在第二个线程结束之前将消息从第二个线程发送到队列。消息处理器会注意到该消息并完成。这是'调度员'的方式。 – quetzalcoatl
线程wiil来终止它得到函数f结束后,和。
像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
}
}
但是,这并不是非常好的使用全局变量为要独立运行每个线程...
- 1. 如何终止C++ 11中的线程?
- 2. 在C++中终止来自回调函数的线程11
- 3. 线程终止问题(C):最后线程不终止
- 4. 线程终止在C#
- 5. C++ 11动态线程池
- 6. 终止线程
- 7. 进程自动终止
- 8. C++ 11和较新的STL的std ::向量和线程安全
- 9. 从终端自动终止java进程
- 10. 为什么C#线程停止自动
- 11. SlimDX - 终止线程
- 12. Java - 终止线程
- 13. 终止Java线程
- 14. Java终止或终止线程
- 15. 使用使用C++ 11线程库C++ 11个线程
- 16. 如何在Qt中终止线程C++
- 17. 调用SIGINT时终止线程 - C
- 18. C#线程异常终止异常
- 19. c#wpf线程没有正确终止
- 20. win32线程意外终止在activeX(C++)
- 21. 终止当前线程
- 22. Boost线程终止程序?
- 23. C++ 11 async - 自动管理最佳线程数量吗?
- 24. C++ 11线程vs升级线程
- 25. C++ 11线程与.Net线程?
- 26. C程序终止
- 27. C++程序终止
- 28. 如何在JVM自动终止时生成线程转储
- 29. 如何在线程终止后自动执行FreeAndNill()
- 30. 终止线程池中的线程
这正是我一直在寻找的。谢谢。 –