执行异步作业的函数

Hum*_*awi 1 c++ multithreading detach

我有函数foo:

void foo(){
    //Command set A
    std::this_thread::sleep_for(100s);
    //Command set B
}
Run Code Online (Sandbox Code Playgroud)

第一部分是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()
}
Run Code Online (Sandbox Code Playgroud)

detach在这里使用得当吗?它是正确的使用场所detach吗?有更好的解决方案吗?

bes*_*esc 6

detach很少是正确的解决方案.如果确切地说它:它删除了std::thread对象和实际线程之间的连接.线程一直运行直到它自己完成,但是如果你没有明确地实现与线程的通信(例如通过消息队列),你的程序就失去了对它的任何控制.

如果程序结束时线程仍处于活动状态,则会出现问题.你的进程正处于释放资源和死亡的过程中,但线程正在快速地使用其中一些资源.因为所有资源都被释放了,即使是最基本的资源(想想低级C++运行时),这也是desaster的一个秘诀.机会是,您的程序将在退出时崩溃.

寻找std::async直接的替代品.它以异步方式运行任务并立即返回a std::future.即使任务没有返回任何数据,那么未来是你可以保持的句柄,并且在程序退出时检查线程是否仍在运行 - 并且如果必要,等待它完成.