linux下多線程踩過的坑(不定更新)


1,多線程下整個進程的退出

<<APUE>>關於進程環境一章中指出了進程退出的8個條件:

...

(4)最后一個線程從啟動例程中返回

(5)最后一個線程調用pthread_exit()返回

...

這些條件一個前提是,主線程在等待子線程返回,若沒有等待,則是主線程退出,整個進程直接退出了。其實主線程在等待子線程時,是阻塞到join()上了,最后也是主線程最后退出,整個進程也結束了。

主線程

1 ... 2 { 3 pthread_create(...) 4 //打印 “In the main”
5 sleep(1); 6 }

 

子線程

1 ... 2 { 3 //打印 “I am First”
4 sleep(2); 5 //打印 “I am Second”
6 }

這樣子線程中的第二句話,永遠也打印不出來;當去掉主線程中的sleep(1)后,子線程中的第一句話有時能打印出來,有時不能打印出來,第二句話永遠也打印不出來,其實這里的sleep(1)起到了一個類似join()的作用。

多線程中切記一定要在主線程中join()子線程,也不要對sleep(...)產生任何信任,說不定子線程運行一半就退出了。

 

(2)多線程中的打印函數切記一定是沒有輸入緩沖的。

當我用cout,fprintf等函數往控制台上輸出時,一開始還是正確的,當我不斷運行同一個程序時,就會產生問題,有些語句輸出了兩次,如I am second連續打印了兩次,有時候兩句話輸出到了同一行(就是endl沒有起作用),我猜想因為這些函數是帶有輸入緩沖的。

改用了

1 #include<unistd>
2 size_t write(int filedes, const void* buf, size_t bufsize);

函數后,就沒有上面的問題了。

多線程中這種寫日志的信息,我想應該用系統不帶緩沖的I/O,而別去使用標准庫I/O。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM