关于了解C++线程"detach()"的问题

Qestion about understanding "detach()" on threads in C++

本文关键字:detach 问题 于了解 线程 了解 C++      更新时间:2023-10-16

我总是在互联网上看到规则:

如果不分离\加入线程,则将调用abort。

我需要一个中止发生的原因。

我可以理解join——因为当不对某个线程执行join时,main可能会在线程之前关闭,这可能会产生问题。

但是分离没有任何作用!它没有任何目的(至少从我在运行线程时看到的情况来看,无论是否分离)。

究竟是什么让中止跳转,任何分离的目的究竟是什么?

以下是导致"中止"的一个简单示例:

#include <iostream>       // std::cout
#include <thread>         // std::thread, std::this_thread::sleep_for
#include <chrono>         // std::chrono::seconds
void pause_thread(int n) 
{
std::this_thread::sleep_for (std::chrono::seconds(n));
std::cout << "pause of " << n << " seconds endedn";
}
int main() 
{
std::cout << "Spawning and detaching 3 threads...n";
std::thread (pause_thread,1);
std::cout << "Done spawning threads.n";
// give the detached threads time to finish (but not guaranteed!):
pause_thread(5);
return 0;
}

线程与进程是不同的野兽。线程在父/子关系中根本不是。

C++11线程实现必须与所有主要的操作系统线程兼容,因此它必须做出设计决策,而这在第一眼就无法理解。

我将描述pthread,它在linux世界中使用。

创建线程时,可以指定其分离状态。它可以是两个值:

  • DETACHED:当线程退出时,其分配的资源会自动释放。线程无法连接
  • JOINABLE:当线程退出时,它的一些资源不会自动释放。例如,它的返回代码(在pthread中,有一个线程的返回值)。线程可以连接。资源将在join()处释放

C++线程被创建为JOINABLE,但您可以稍后分离它。

现在,如果在~thread()不分离/连接线程,那么线程实现可以做什么?这是一个问题,因为如果它什么都不做,那么一些资源将被悄悄地泄漏(作为一个JOINABLE线程,当退出时,它的一些资源不会自动释放)

  • 自动调用join():这不是一个好主意,因为程序可能会在上面停滞(如果线程仍在运行)。这可能是一个编程错误
  • 自动调用detach():这也不是一个好主意,因为它可能是一个编程错误(线程继续运行,但其thread对象已损坏-在这种情况下,程序员应该显式调用detach())
  • 调用abort():这是实现所能做的最好的事情,以避免编程错误

因此std::thread的设计者选择调用abort()以避免编程错误。

(在windows上,线程系统是类似的。你必须为一个线程调用CloseHandle,这样它的资源才能被释放)