Linux編程中的坑——C++中exit和return的區別

來源:互聯網
上載者:User

標籤:自動   區別   代碼   star   tool   class   自動調用   情況   c++   

今天遇到一個坑,折騰了一天才把這個坑填上,情況是這樣的:

寫了段代碼,在main()函數中建立一個分離線程,結果這個線程什麼都沒幹就直接掛掉了,代碼長這樣:

[cpp] view plain copy 
  1. int main()  
  2. {  
  3.    建立一個分離線程();  
  4.    return 0;  
  5. }  

後來百度)了一下,原來在main()函數中寫return,會被編譯器最佳化成,也會像exit一樣直接殺死所有進程,所以分離出來的線程什麼都沒幹,就隨著進程一起掛掉了。

所以多線程編程中,main()函數想退出線程應當使用

 

[cpp] view plain copy 
  1. pthread_exit(NULL);  

補一下pthread_exit和return的區別:pthread_exit為直接殺死/退出當前進程,return則為退出當前函數,但是在g++編譯器中,main中的return會被自動最佳化成exit,所以在主函數中使用return會退出所有線程的運行。
其實從原理來講區別應該很大的,這裡就先挖個坑寫上這些,改天再來填。。。→_→

還有個比較明顯的區別:return會調用局部對象的解構函式,而pthread_exit不會(不管是否main()函數,這個區別都是存在的)

 

用pthread_exit只會使主線程自身退出,產生的子線程繼續執行;用return則所有線程退出。 

綜合以上要想讓子線程總能完整執行(不會中途退出),一種方法是在主線程中調用pthread_join對其等待,即pthread_create/pthread_join/pthread_exit或return;一種方法是在主線程退出時使用pthread_exit,這樣子線程能繼續執行,即pthread_create/pthread_detach/pthread_exit;還有一種是pthread_create/pthread_detach/return,這時就要保證主線程不能退出,至少是子線程完成前不能退出。現在的項目中用的就是第三種方法,主線程是一個死迴圈,子線程有的是死迴圈有的不是。

<參考資料語> 

理論上說,pthread_exit()和線程宿體函數退出的功能是相同的,函數結束時會在內部自動調用pthread_exit()來清理線程相關的資源。但實際上二者由於編譯器的處理有很大的不同。 

在進程主函數(main())中調用pthread_exit(),只會使主函數所在的線程(可以說是進程的主線程)退出;而如果是return,編譯器將使其調用進程退出的代碼(如_exit()),從而導致進程及其所有線程結束運行。 

 

Linux編程中的坑——C++中exit和return的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.