【问题标题】:A function that do an asynchronized job执行异步工作的函数
【发布时间】:2018-01-07 18:43:08
【问题描述】:

我有函数 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 的正确地方吗?有没有更好的解决方案?

【问题讨论】:

  • 我想说分离是正确的,只要你不关心命令集 B 的任何输出(比如它是否失败)。如果你加入,它会阻止。
  • 退出程序时最好确保没有其他线程在运行。我看不出你会如何在当前的实现中做到这一点。
  • 就个人而言,我会说永远不要使用detach,除非你已经建立了控制线程消亡的机制。
  • @nwp 所以,换句话说,分离作为一个概念是不推荐的?
  • @Galik 其实我的问题有点假设。我用另一种方式解决了我的问题。但我想知道是否为这种情况创建了分离。所以,我问了。

标签: c++ multithreading detach


【解决方案1】:

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

如果程序结束时线程仍然处于活动状态,事情就会变得有问题。您的进程正处于释放其资源和死亡的过程中,但线程正在使用其中的一些资源愉快地运行。因为所有资源都被释放了,即使是最基本的资源(想想低级 C++ 运行时)也会导致灾难。很有可能,您的程序会在退出时崩溃。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多