Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个C++;线程代码触发abort()错误?_C++_Multithreading_C++11 - Fatal编程技术网

C++ 为什么这个C++;线程代码触发abort()错误?

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!"

我正在测试新的C++11线程特性。为此,我通过向其构造函数提供lambda表达式来启动线程:

   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
是原因