执行异步作业的函数

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 任何数据,那么未来就是你可以坚持的句柄,并在程序退出时检查线程是否仍然 运行 – 并等待它完成,如有必要.