我正在阅读C ++ 11中的线程,我做了
#include <iostream>
#include <thread>
using namespace std;
void doSomething() { cout << "Inside doSomething " << endl; }
void doSomethingElse() { cout << "Inside doSomethingElse " << endl; }
int main(void)
{
// Using LAMBDA expressions to call the functions.
thread my_thread([](){ doSomething(); doSomethingElse(); });
//my_thread.join(); ---------------> 1
return 0;
}
我试图在不调用my_thread.join()
的情况下执行代码,Visual Studio 2013正在抛出&#34; abort()已被调用&#34;。
是什么原因?
答案 0 :(得分:5)
这与lambdas无关。如果thread
在其析构函数执行joinable
时为std::terminate
,则会被调用。为避免这种情况,您必须致电thread::join
或thread::detach
。该标准甚至继续在一份说明中提供这一决定的理由。
来自§30.3.1.3/ 1 [thread.thread.destr]
~thread();
如果
joinable()
,请致电std::terminate()
。否则,没有任何影响。 [注意:隐式分离或加入其析构函数中的joinable()
线程可能导致难以调试正确性(用于分离)或性能(用于连接)仅在引发异常时遇到错误。因此,程序员必须确保在线程仍可连接时永远不会执行析构函数。 -end note ]
早期的C ++ 0x草案中的措辞曾经是
如果
joinable()
然后detach()
,则无效。 ...
N2802包含为什么稍后删除析构函数中detach()
的隐式调用的其他详细信息。