1. 程式人生 > >Linux執行緒和fork

Linux執行緒和fork

參考這個部落格就可以了:

int pthread_atfork(void (*prepare)(void), void (*parent)(void),void (*child)(void));  //執行緒建立程序    

用pthread_atfork函式最多可以安裝3個幫助清理鎖的函式。

prepare處理程式:

由父程序,在fork建立子程序前呼叫。這個fork處理程式的任務是獲取父程序定義的所有鎖。

parent處理程式:

是在fork建立子程序以後、返回之前在父程序上下文中呼叫的。這個fork處理程式的任務是對 prepare處理程式獲取的所有鎖進行解鎖。

child處理程式:

在fork返回之前在子程序上下文中呼叫。與parent fork處理程式一樣, child fork處理程式也必須釋放prepare fork處理程式獲取的所有鎖。

注意:

不會出現加鎖一次解鎖兩次的情況,雖然看起來也許會出現。

子程序地址空間在建立時就,得到了父程序定義的所有鎖的副本。

因為prepare fork處理程式獲取了所有的鎖,父程序中的記憶體和子程序中的記憶體內容在開始的時候是相同的。當父程序和子程序對它們鎖的副本程序解鎖的時候,新的記憶體是分配給子程序的,父程序的記憶體內容是複製到子程序的記憶體中(寫時複製),所以我們就會陷入這樣的假象,看起來父程序對它所有的鎖的副本進行了加鎖,子程序對它所有的鎖的副本進行了加鎖。父程序和子程序對在不同記憶體單元的重複的鎖都進行了解鎖操作,就好像出現了下列事件序列。

總結:

一般工程裡就不會在多執行緒裡面,在來搞多程序,不會自己給自己找麻煩