c++ - 执行异步作业的函数

标签 c++ multithreading detach

我有函数 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/

相关文章:

c++ - 为什么必须使用函数指针?

c++ - Directshow 渲染过滤器仅在 Release模式下崩溃

Python进程同步

linux - Bash:分离下标,但保持交互

graph - 为什么使用分离方法改变张量使得反向传播并不总是无法在pytorch中工作?

c++ - `const std::string& s = nullptr` 作为可选参数如何工作

c++ - 使用 Composition API 通过 C++ UWP 应用程序在 XAML Canvas 上绘制对象

c# - 如何在多线程环境中保持对象成员变量对线程私有(private)

java - 如何更改 JButton 属性?

Android 分离数据库