Linux執行緒和fork
阿新 • • 發佈:2018-12-10
參考這個部落格就可以了:
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處理程式獲取了所有的鎖,父程序中的記憶體和子程序中的記憶體內容在開始的時候是相同的。當父程序和子程序對它們鎖的副本程序解鎖的時候,新的記憶體是分配給子程序的,父程序的記憶體內容是複製到子程序的記憶體中(寫時複製),所以我們就會陷入這樣的假象,看起來父程序對它所有的鎖的副本進行了加鎖,子程序對它所有的鎖的副本進行了加鎖。父程序和子程序對在不同記憶體單元的重複的鎖都進行了解鎖操作,就好像出現了下列事件序列。
總結:
一般工程裡就不會在多執行緒裡面,在來搞多程序,不會自己給自己找麻煩