我有函数 foo:
void foo(){
//Command set A
std::this_thread::sleep_for(100s);
//Command set B
}
命令集 A
的第一部分必须阻止执行。但是,sleep
部分和 //Command set B
不必阻塞执行,也不会返回任何数据。
所以我实现如下:
void foo(){
//Command set A
std::thread t([](){
std::this_thread::sleep_for(100s);
//Command set B
}
t.detach()
}
我在这里是否正确使用了detach
?它是使用detach
的正确位置吗?有更好的解决方案吗?
最佳答案
detach
很少是正确的解决方案。 If 确实如其所说:它删除了 std::thread
对象和实际线程之间的连接。线程会一直运行直到它自己完成,但是如果您没有显式地实现与线程的通信(例如通过消息队列),您的程序就会失去对它的任何控制。
如果线程在程序结束时仍然处于事件状态,事情就会变得有问题。您的进程正处于释放资源和死亡的中间,但线程正在愉快地使用其中的一些资源。因为所有资源都被释放了,即使是最基本的资源(想想低级 C++ 运行时)也是灾难的根源。很有可能,您的程序会在退出时崩溃。
查看std::async
直接更换。它异步运行任务并立即返回 std::future
。即使任务不返回任何数据,future 也是您可以持有的句柄,并在程序退出时检查线程是否仍在运行 - 并在必要时等待它完成。
关于c++ - 执行异步作业的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48140390/