C++ 为什么这个C++;线程代码触发abort()错误?
我正在测试新的C++11线程特性。为此,我通过向其构造函数提供lambda表达式来启动线程:C++ 为什么这个C++;线程代码触发abort()错误?,c++,multithreading,c++11,C++,Multithreading,C++11,我正在测试新的C++11线程特性。为此,我通过向其构造函数提供lambda表达式来启动线程: int main() { thread t([]() { cout << "Hello World!" << endl; }); //this_thread::sleep_for(chrono::seconds(5)); cout << "I am done!"
int main()
{
thread t([]() {
cout << "Hello World!" << endl;
});
//this_thread::sleep_for(chrono::seconds(5));
cout << "I am done!" << endl;
getchar();
return 0;
}
intmain()
{
螺纹t([])(){
cout你看到的行为是预期的,下面解释如何避免它
从
如果*this有一个关联的线程(joinable()==true),则调用std::terminate()
线程对象没有关联的线程(可以安全地销毁)
- 它是默认构造的
- 它是从
- 已调用join()
- 已调用detach()
那又怎样?我知道调用join()只能让主线程等待工作线程。在这种情况下,等待没有意义,因为我按了一个键
为什么等待没有意义?如果main
函数在线程使用std::cout
流对象之前完成执行,会发生什么情况(尽管不太可能,即使您有getchar()
调用,它仍然是可能的)?全局流对象对线程使用仍然有效吗?您看到的行为是预期的,下面解释如何避免它
从
如果*this有一个关联的线程(joinable()==true),则调用std::terminate()
线程对象没有关联的线程(可以安全地销毁)
- 它是默认构造的
- 它是从
- 已调用join()
- 已调用detach()
那又怎样?我知道调用join()只能让主线程等待工作线程。在这种情况下,等待没有意义,因为我按了一个键
为什么等待没有意义?如果main
函数在线程使用std::cout
流对象之前完成执行,会发生什么情况(尽管不太可能,即使您有getchar()
调用,它仍然是可能的)?全局流对象对线程使用仍然有效吗?因为没有调用join
函数(即t.join();
)。那又怎样?我理解join()必须只调用主线程来等待工作线程。在这种情况下,等待没有任何意义,因为我按了一个键。因此您泄漏了一个资源。这是一个非常非常昂贵的资源。当线程
实例被销毁时,它必须被联接或分离,否则将调用终止
。()“等待没有目的”与:std::thread::~thread
:销毁线程对象,必须连接或分离底层线程,因为没有调用join
函数(即t.join();
)。那又怎样?我理解join()必须只调用主线程来等待工作线程。在这种情况下,等待没有任何意义,因为我按了一个键。因此您泄漏了一个资源。这是一个非常非常昂贵的资源。当线程
实例被销毁时,它必须被联接或分离,否则将调用终止
。()“等待没有目的”与:std::thread::~thread
:破坏thread对象,底层线程必须被连接或分离AHH,我明白了。但我不明白的是。假设我写线程t([](){…});然后在下一行写t.join()(在main中)。不过,t可以在调用t.join()之前完成(理论上)因此它调用std::terminate?可以肯定的是,std::terminate使VS显示调试错误,对吗?@NicolasLykkeIversen是的,t
在调用join
之前完成执行是完全可以的。问题是在调用t
的析构函数之前需要调用join
(即,在关闭}
主功能的括号之前)因此,在使用lambda表达式构造t
之后立即调用join
将保证t
在执行t
的析构函数之前完成。啊哈!这是有意义的…不过,是不是由t调用的std::terminate(因为它是可接合的)这会导致VS给出调试错误?或者是什么原因导致它?好的join
或detach
。主要的问题是joinable
需要返回false
@NathanOliver是的,答案是detach
有效,并且joinable==true
是原因std::terminatede>被调用。啊,我明白了。但我不明白的是。假设我写线程t([](){…});然后在下一行写t.join()(在main中)。不过,t可以在调用t.join()之前完成(理论上)因此它调用std::terminate?可以肯定的是,std::terminate使VS显示调试错误,对吗?@NicolasLykkeIversen是的,t
在调用join
之前完成执行是完全可以的。问题是在调用t
的析构函数之前需要调用join
(即,在关闭}
主功能的括号之前)因此,在使用lambda表达式构造t
之后立即调用join
将保证t
在执行t
的析构函数之前完成。啊哈!这是有意义的…不过,是不是由t调用的std::terminate(因为它是可接合的)这会导致VS给出调试错误?或者是什么方式导致它?好的join
或detach
。主要的问题是joinable
需要返回false
@NathanOliver是的,答案说明detach
有效,并且joinable==true
是原因