2014-07-04 23 views
4

聽說「現代操作系統將清理該進程所創建的所有線程上的關閉它」,但是當我回到main(),我得到這些錯誤:C++ 11 main()返回時是否殺死線程?

1)該應用程序已請求運行以不尋常的方式終止它。 有關更多信息,請聯繫應用程序的支持團隊。

2)終止調用時沒有活動異常

我的實現看起來像這樣(我現在正在寫例如對不起,壞的實現):

void process(int id) 
{ 
    while(true) { std::this_thread::sleep_for(std::chrono::milliseconds(1); } } 
} 

int main() 
{ 
    std::thread thr1(process, 0); 
    std::thread thr2(process, 1); 
    //thr1.detach(); 
    //thr2.detach(); 
    return 0; 
} 

如果我取消detach(); S,沒有問題,但我的處理線程將是套接字讀取器/編寫器,並且它們將無限運行(直到主返回)。那麼如何處理呢?怎麼了?

編輯:即我不能分開()每個線程一個接一個,因爲他們不會正常終止(直到結束)。噢,再次,如果我從DDOS窗口的X按鈕關閉我的程序,(我的簡單解決方案在這種情況下不起作用)my detach();函數被傳遞,因爲程序強制終止,這裏又是錯誤:)

+0

你想要發生什麼?你想退出該計劃還是希望永久運行? – usr

+0

@usr當'main()'返回時,我只想殺死(** edit:** _terminate/detach_)所有線程。 – PilawyerDev

+0

閱讀您再次聽到的報價,並查看它如何從'main'返回。 –

回答

5

應用程序中發生的事與操作系統無關。

如果std::thread被破壞,仍然有一個可連接的線程,應用程序調用std::terminate,而這正是被顯示出來:http://en.cppreference.com/w/cpp/thread/thread/~thread`

與C++ 11個線程,要麼你分離,如果你不小心上它們的完成時間,或者在線程對象被銷燬之前,您關心並需要連接。

+1

也許一個簡單的解決方案的例子? **編輯:**處理析構函數並自行終止/終止線程進程,對不對? – PilawyerDev

+0

只需將所有工作線程存儲在析構函數中的'join()'類中。哦,Boost.Asio似乎是你的正確工具(因爲你想做一個網絡應用程序)。您可以輕鬆設置網絡工作線程的線程池並正常退出。 – Chnossos