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

时间:2017-01-24 12:56:21

标签: c++ multithreading

我总是在网上看到规则:

  

如果你没有分离\加入一个线程,那么将调用abort。

我需要一个理由说明为什么会中止。

我可以通过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 ended\n";
}

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;
}

1 个答案:

答案 0 :(得分:0)

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

C ++ 11线程实现必须与所有主要的OS线程兼容,因此它必须做出设计决策,而这些决定一见不到。

我将描述在Linux世界中使用的pthread。

创建线程时,可以指定其detachstate。它可以是两个值:

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

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

现在,如果你没有分离/加入一个线程,在~thread(),线程实现可以做什么?这是一个问题,因为如果它没有做任何事情,那么一些资源将被静默泄露(当退出时作为一个JOINABLE线程,它的一些资源不会自动释放)

  • 自动调用join():不是一个好主意,因为程序可以停止它(如果线程仍在运行)。这可能是编程错误。
  • 自动调用detach():也不是一个好主意,因为它可能是编程错误(线程继续运行,但其thread对象被销毁 - 程序员在这种情况下应该明确地调用detach()
  • call abort():这是实现可以做的最好的,以避免编程错误

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

(在Windows上,线程系统类似。你必须为一个线程调用CloseHandle,以便可以释放它的资源)