use*_*352 0 c++ multithreading c++11
我已经尝试寻找解决方案的多种方法,但到目前为止找不到合适的方法。
我正在使用分离线程,因为我不希望我的主线程等待/阻塞新的子线程,因为它还有许多其他重要的事情要做。
我创建一个线程如下:
std::thread rsync_t(&PreCompile::RunPreCompileThr, obj, arg1, arg2);
rsync_t.detach();
Run Code Online (Sandbox Code Playgroud)
现在,目标是定期检查这个分离的线程是否处于活动状态并正在运行。
我尝试了未来/承诺和异步方式来做到这一点,但它需要 .get(),它类似于 join(),这是我不想要的。
有什么建议可以做到这一点吗?
提前致谢。
一旦你分离了一个线程,那么你已经明确地说“我不需要等待这个线程完成”。这通常是因为线程永远不会结束,并且一直运行到程序结束。
在任何情况下,std::thread都不提供轮询机制以查看线程是否已完成而无需等待。为此,无论线程是否分离,您都需要使用替代机制。
一种选择是启动线程std::async(std::launch::async, func)并使用返回的未来检查线程是否仍在运行。
auto future=std::async(std::launch::async,thread_func);
bool thread_is_still_running=future.wait_for(std::chrono::seconds(0))!=std::future_status::ready;
Run Code Online (Sandbox Code Playgroud)
如果使用此选项,则需要保留future对象(例如,将其存储在长期std::vector变量或全局变量中),因为其析构函数将等待线程完成。
或者,您可以使用 astd::mutex和一个布尔标志,或者std::atomic<bool>在线程退出之前从线程内设置的a来指示线程何时完成。
std::atomic<bool> done=false;
void thread_func(){
do_stuff();
done=true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |