执行异步作业的函数

A function that do an asynchronized job

本文关键字:函数 作业 异步 执行      更新时间:2023-10-16

我有函数foo:

void foo(){
//Command set A
std::this_thread::sleep_for(100s);
//Command set B
}

Command set 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++运行时),这也是 desaster 的秘诀。很有可能,您的程序会在退出时崩溃。

查看std::async以获得直接的替换。它异步运行任务并立即返回std::future。即使任务没有返回任何数据,那么未来就是您可以抓住的句柄,并在程序退出时检查线程是否仍在运行 - 并在必要时等待它完成。