Linux多執行緒中fork 呼叫的相關問題總結

2021-09-25 14:02:09 字數 1240 閱讀 2575

在乙個多執行緒程式中的某個執行緒呼叫了fork函式,那麼子程序只會擁有乙個執行執行緒(呼叫fork函式的執行緒),其他"已經"建立的執行緒將不會複製給子程序,子程序多執行緒的情況是在呼叫fork函式的子執行緒之後呼叫pthread_create函式實現的。

由fork函式建立的子程序會繼承父程序的鎖及其狀態,但子程序可能不清楚從父程序繼承而來的互斥鎖的具體狀態(是加鎖還是解鎖狀態),這個互斥鎖可能被加鎖了,但是並不是由呼叫fork函式的那個執行緒鎖住的,而是由其他執行緒鎖住的。如果是這種情況,則子程序若再次對該互斥鎖執行加鎖操作就會導致死鎖

確保fork呼叫後父程序和子程序都擁有乙個清楚的鎖狀態的函式是 pthread_atfork;

int thread_atfork(void(*prepare)(void),void(*parent)(void),void(*child)(void));

下面**並不是加鎖一次解鎖了兩次,而是各自獨自解鎖。因為prepare函式是在建立子程序之前執行的,因此此時互斥鎖是鎖住的狀態,parent函式執行是在子程序建立之後,其首先是對prepare中鎖住的互斥鎖解鎖,但此時在子程序中任然有乙個鎖住的互斥鎖的副本(fork的寫時複製機制),因此需要在child中再次解鎖。

需要注意的是pthread_atfork只能清理鎖,但不能清理條件變數。在有些系統的實現中條件變數不需要清理。但是在有的系統中,條件變數的實現中包含了鎖,這種情況就需要清理。但是目前並沒有清理條件變數的介面和方法。

下面是引用別人的一段**(使用非常清楚):

#include#include#include#include#include#include//使用pthread_atfork函式進行獲取鎖

pthread_mutex_t mutex;

void *fun(void *arg)

void prepare() //pthread_atfork一旦被呼叫就會執行該函式,但是需要等待fun釋放鎖才可以將鎖加上

void parent()

void child()

int main()

else

}

linux下多執行緒中的fork介紹

目錄 回想一下 當乙個程式只有主線程的時候呼叫fork,此時fowww.cppcns.comrk會建立出的子程序也會只有一條執行緒 那要是把fork放入多執行緒的程式中呢?我們來試驗下 include include include void pthread fun void arg int mai...

多執行緒與fork

多執行緒程式裡盡量不使用fork 在多執行緒程式裡,在 自身以外的執行緒存在的狀態 下一使用fork的話,就可能引起各種各樣的問題.比較典型的例子就是,fork出來的子程序可能會死鎖.請不要,在不能把握問題的原委的情況下就在多執行緒程式裡fork子程序,能引起什麼問題呢?那看看例項吧.一執行下面的 ...

Linux中fork 系統呼叫函式

什麼是fork 呼叫fork 發生了什麼 子程序建立後,系統會給子程序分配資源,然後把原來的程序的所有值都複製到新的子程序中,只有少數值與原來的程序的值不同 其實就是父程序的乙份副本。但是子程序和父程序駐留在不同的記憶體空間上。這些記憶體空間具有相同的內容,並且乙個程序執行的任何操作都不會影響其他程...