小编典典

我什么时候应该使用 std::thread::detach?

all

有时我必须使用它std::thread来加速我的应用程序。我也知道join()等到一个线程完成。detach()这很容易理解,但是调用和不调用有什么区别呢?

我认为没有detach(),线程的方法将独立使用线程工作。

不分离:

void Someclass::Somefunction() {
    //...

    std::thread t([ ] {
        printf("thread called without detach");
    });

    //some code here
}

使用分离调用:

void Someclass::Somefunction() {
    //...

    std::thread t([ ] {
        printf("thread called with detach");
    });

    t.detach();

    //some code here
}

阅读 60

收藏
2022-08-20

共1个答案

小编典典

在 的析构函数中std::threadstd::terminate如果:

  • 线程未加入(使用t.join()
  • 并且也没有分离(用t.detach()

因此,在执行流到达析构函数之前,您应该始终选择一个join或一个线程。detach


当程序终止(即main返回)时,不会等待在后台执行的剩余分离线程;相反,它们的执行被暂停并且它们的线程本地对象被破坏。

至关重要的是,这意味着 这些线程的堆栈不会展开
,因此某些析构函数不会被执行。根据这些析构函数应该执行的操作,这可能与程序崩溃或被杀死一样糟糕。希望操作系统会释放对文件等的锁定……但您可能已经损坏了共享内存、半写文件等。


那么,您应该使用joinordetach吗?

  • 利用join
  • 除非您需要更大的灵活性并且愿意提供同步机制来自己等待线程完成 在这种情况下您可以使用detach
2022-08-20