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

时间:2016-03-02 17:32:23

标签: 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!" << endl;
        getchar();
        return 0;
    }

但是在我按下一个键(getchar)后,我收到错误:

Debug

有人能说出理由吗?

1 个答案:

答案 0 :(得分:4)

您期望看到的行为,以下内容解释了如何避免这种行为。

来自std::thread::~thread documentation

  

如果* this有一个关联的线程(joinable()== true),则调用std :: terminate()。


  

之后,线程对象没有关联的线程(并且可以安全销毁)      
      
  • 是默认构造的
  •   
  • 它已从
  • 移出   
  • join()被称为
  •   
  • 分离()已被称为
  •   
  

那又怎样?我知道必须只调用join()让主线程等待工作线程。在这种情况下,没有等待的目的,因为我按了一个键。

为什么没有等待的目的?如果//Hook a callback into the rendered Google Search. From my understanding, this is possible because the outermost rendered div has id of "___gcse_0". window.__gcse = { callback: googleCSELoaded }; function googleCSELoaded() { // The hook in question. $("#customSearch").click(function() { var searchText = $("#customSearchText").val(); console.log(searchText); var element = google.search.cse.element.getElement('searchOnlyCSE'); element.execute(searchText); }) } // CSE Code. This is a free version, so please don't make too many requests. (function() { var cx = '001386805071419863133:cb1vfab8b4y'; var gcse = document.createElement('script'); gcse.type = 'text/javascript'; gcse.async = true; gcse.src = 'https://cse.google.com/cse.js?cx=' + cx; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(gcse, s); })(); 函数在线程使用main流对象之前完成执行会发生什么情况(尽管即使你有std::cout调用它仍然不太可能)?该全局流对象是否仍然有效供线程使用?