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。