执行异步作业的函数
A function that do an asynchronized job
我有函数 foo:
void foo(){
//Command set A
std::this_thread::sleep_for(100s);
//Command set B
}
第一部分 Command set A
必须阻止执行。但是,sleep
部分和 //Command set B
不必阻止执行,也不会 return 任何数据。
所以我实现如下:
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
以进行直接替换。它异步运行任务并立即 returns a std::future
。即使任务没有 return 任何数据,那么未来就是你可以坚持的句柄,并在程序退出时检查线程是否仍然 运行 – 并等待它完成,如有必要.
我有函数 foo:
void foo(){
//Command set A
std::this_thread::sleep_for(100s);
//Command set B
}
第一部分 Command set A
必须阻止执行。但是,sleep
部分和 //Command set B
不必阻止执行,也不会 return 任何数据。
所以我实现如下:
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
以进行直接替换。它异步运行任务并立即 returns a std::future
。即使任务没有 return 任何数据,那么未来就是你可以坚持的句柄,并在程序退出时检查线程是否仍然 运行 – 并等待它完成,如有必要.