今天遇到一個坑,折騰了一天才把這個坑填上,情況是這樣的:
寫了段代碼,在main()函數中創建一個分離線程,結果這個線程什么都沒干就直接掛掉了,代碼長這樣:
- int main()
- {
- 創建一個分離線程();
- return 0;
- }
后來百度)了一下,原來在main()函數中寫return,會被編譯器優化成,也會像exit一樣直接殺死所有進程,所以分離出來的線程什么都沒干,就隨着進程一起掛掉了。
所以多線程編程中,main()函數想退出線程應當使用
- 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()),從而導致進程及其所有線程結束運行。