Multithreading 即使主线程已终止,仍保持线程活动

Multithreading 即使主线程已终止,仍保持线程活动,multithreading,c++11,Multithreading,C++11,我不确定我的问题是否正确,但我有以下示例,其中主线程创建两个附加线程。 由于我没有在main的末尾使用join命令,它将继续执行,同时,两个创建的线程将并行工作。但是,由于main在它们完成执行之前被终止,因此我得到以下输出: 在没有活动异常的情况下终止调用 中止(堆芯转储) 代码如下: #include <iostream> // std::cout #include <thread> // std::thread #include <

我不确定我的问题是否正确,但我有以下示例,其中主线程创建两个附加线程。 由于我没有在main的末尾使用join命令,它将继续执行,同时,两个创建的线程将并行工作。但是,由于main在它们完成执行之前被终止,因此我得到以下输出:

在没有活动异常的情况下终止调用

中止(堆芯转储)

代码如下:

#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <chrono>

void foo()
{
    std::chrono::milliseconds dura( 2000 );
    std::this_thread::sleep_for( dura );
    std::cout << "Waited for 2Sec\n";
}

void bar(int x)
{
    std::chrono::milliseconds dura( 4000 );
    std::this_thread::sleep_for( dura );
    std::cout << "Waited for 4Sec\n";
}

int main()
{
  std::thread first (foo);
  std::thread second (bar,0);

  return 0;
}

非常感谢。

保持线程活动是个坏主意,因为它会导致调用
std::terminate
。您应该明确地
加入
线程:

int main()
{
  std::thread first (foo);
  std::thread second (bar, 0);
  first.join();
  second.join();
}
另一种方法是拆下螺纹。但是,您仍然需要断言主线程的寿命更长(例如,通过使用互斥体/condition_变量)

本节摘自C++11标准,与此相关:

15.5.1函数的
std::terminate()

1在某些情况下,由于不太细微的错误,必须放弃异常处理 处理技术。[注:这些情况是:

[……]

--当在上调用析构函数或复制赋值运算符时 引用可接合线程的
std::thread
类型的对象

因此,在退出作用域之前,必须在线程上调用
join
detach



关于您的编辑:您必须将线程存储在一个列表(或类似列表)中,并在
main
完成之前等待每一个线程。更好的方法是使用线程池(因为这限制了创建的线程总数).

在第一个示例中,我尝试了分离。我没有得到任何错误,但应用程序在线程完成其工作之前终止。@HA-AS
detach
是危险的。您仍然需要断言
main
尚未完成。只需使用
join
,这会更简单。非常感谢您的解释。假设main不是te终止是因为它正在使用io_服务。run()。join()命令是否可以为我服务,即使处理程序已终止?我不知道是什么
io_服务。run())
是。您需要管理线程。最简单的方法是将它们添加到列表中,并对每个列表项调用join。对不起,io_服务是我在应用程序中主要使用的boost库的一部分。主要问题是我不知道要创建多少线程,这是一个运行时问题。
int main()
{
  std::thread first (foo);
  std::thread second (bar, 0);
  first.join();
  second.join();
}