2017-02-11 81 views
0

我想了解如何使用線程和這個簡單的代碼崩潰與此錯誤: enter image description hereCPP簡單的線程程序崩潰在出口

代碼:

#include <iostream> 
#include <thread> 
#include <chrono> 

using namespace std; 

void thread1() 
{ 
    while (true) 
    { 
     cout << this_thread::get_id() << endl; 
    } 
} 

void main() 
{ 
    thread t1(thread1); 
    thread t2(thread1); 

    this_thread::sleep_for(chrono::seconds(1)); 

    t1.detach(); 
    t2.detach(); 
} 

可有人請解釋爲什麼它在分離之後崩潰以及如何解決這個問題?

+0

'std :: thread :: detach()'通常是一個壞主意。 –

+0

但我別無選擇 –

+0

非正式地,所有(非共享)資源都應該在程序退出時由操作系統回收。但在這種情況下,仍然有一些運行線程,這使得操作系統發瘋。 – felix

回答

1

出現錯誤的原因是在取消初始化後訪問CRT(C++運行時庫)。

工作線程使用CRT通過訪問std::cout。當主線程離開main函數時,CRT庫正在卸載,但工作線程仍在嘗試使用它。可能有一個運行時檢查它,所以你會得到一個錯誤信息,而不僅僅是程序崩潰。

最好不要使用detach方法,並確保所產生的所有線程都在程序退出時完成執行。