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