C ++ 11 Threads:使用lambdas调用时的异常

时间:2014-06-06 10:57:08

标签: c++ multithreading c++11

我正在阅读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;。 是什么原因?

1 个答案:

答案 0 :(得分:5)

这与lambdas无关。如果thread在其析构函数执行joinable时为std::terminate,则会被调用。为避免这种情况,您必须致电thread::jointhread::detach。该标准甚至继续在​​一份说明中提供这一决定的理由。

来自§30.3.1.3/ 1 [thread.thread.destr]

 ~thread();
     

如果joinable(),请致电std::terminate()。否则,没有任何影响。 [注意:隐式分离或加入其析构函数中的joinable()线程可能导致难以调试正确性(用于分离)或性能(用于连接)仅在引发异常时遇到错误。因此,程序员必须确保在线程仍可连接时永远不会执行析构函数。 -end note ]

早期的C ++ 0x草案中的措辞曾经是

  

如果joinable()然后detach(),则无效。 ...

N2802包含为什么稍后删除析构函数中detach()的隐式调用的其他详细信息。