1. 程式人生 > >每天進步一點點——論fork()函式與Linux中的多執行緒程式設計

每天進步一點點——論fork()函式與Linux中的多執行緒程式設計

1. 雖然只將發起fork()呼叫的執行緒複製到子程序中,但全域性變數的狀態以及所有的pthreads物件(如互斥量、條件變數等)都會在子程序中得以保留,這就造成一個危險的局面。例如:一個執行緒在fork()被呼叫前鎖定了某個互斥量,且對某個全域性變數的更新也做到了一半,此時fork()被呼叫,所有資料及狀態被拷貝到子程序中,那麼子程序中對該互斥量就無法解鎖(因為其並非該互斥量的屬主),如果再試圖鎖定該互斥量就會導致死鎖,這是多執行緒程式設計中最不願意看到的情況。同時,全域性變數的狀態也可能處於不一致的狀態,因為對其更新的操作只做到了一半對應的執行緒就消失了。fork()函式被呼叫之後,子程序就相當於處於signal handler之中,此時就不能呼叫執行緒安全的函式(用鎖機制實現安全的函式),除非函式是可重入的,而只能呼叫非同步訊號安全(async-signal-safe)的函式。fork()之後,子程序不能呼叫: