執行緒的互斥

2021-08-01 19:06:45 字數 1876 閱讀 4421

執行緒需要互斥的原因:

由於多個執行緒同時在程序的位址空間內部執行,所以程序的大部分資源相對於執行緒而言都是共享的,所以當多個執行緒同時對於某個臨界資源進行操作時,就會出現問題,所以,執行緒之間對於臨界資源的訪問需要互斥的進行訪問,以便造成不確定的結果。

範例:

#include#includeint _val = 0;

void* thread_run()

printf("\n");

return null;

}int main()

int i =0;

while(i<5000)

printf("\n");

return 0;

}

此段**是兩個執行緒對於同乙個全域性變數進行累加操作,可是執行多次,產生的結果不一定是10000;

結果:

為了解決這種問題,對於臨界資源的訪問,需要加上互斥鎖,才能保證不同執行緒對於臨界資源的互斥訪問,使得程式向著正確的方向去推進;

**:

#include#includeint _val = 0;

pthread_mutex_t mutex = pthread_mutex_initializer; //定義mutex互斥鎖

void* thread_run()

printf("\n");

return null;

}int main()

int i =0;

while(i<5000)

pthread_join(tid,null);

printf("\n");

pthread_mutex_destroy(&mutex);

return 0;

}

對於臨界資源的訪問要進行互斥訪問,但是由於互斥訪問中某些執行緒的優先順序的問題會導致死鎖問題的發生; 死鎖

產生死鎖的原因:

(1)競爭不可搶占性資源引起死鎖;

(2)競爭可消耗性資源引起死鎖;

(3)執行緒推進順序不當引起死鎖;

死鎖的概念:

如果一組程序中的每乙個程序都在等待僅由改組程序中的其他程序才能引發的事件,那麼,改組程序就是死鎖的。

注:對於乙個程序中的多個執行緒也是如此:當某個程序中的所有執行緒都在等待由這個程序中的執行緒才能引發的事件,那麼,這個程序中的所有執行緒都處於死鎖狀態;

產生死鎖的必要條件:

(1)互斥條件:程序對於所分配到的資源進行排他性使用,在某一段時間段內,某資源只能被乙個程序使用。則:此時如果有其他                               程序請求該資源,只能等待,直到該程序將此資源釋放才可以使用;

(2)請求和保持條件:程序已經保持了至少乙個資源,但又提出了新的資源請求,但是該資源已經被其他程序占有,,此時請求程序被阻塞,但是對於自己保持的資源請求不放。

(3)不可搶占條件:程序已經獲得的資源在未使用完之前不能被搶占,只能在程序使用完之後自己釋放;

(4)迴圈等待條件:在發生死鎖時:必然存在乙個程序----資源的迴圈鏈。

避免死鎖的演算法:

銀行家演算法:每乙個程序在進入系統時,它必須申明在執行過程中可能需要某種資源數目的最大數目,其數目不應該超過系統所擁有的資源總量。當程序請求一組資源時:系統必須首先確定是否有足夠的資源分配給該程序;若有:再進一步計算在將這些資源分配給該程序後,是否會使系統處於不安全狀態。如果不會,才將資源分配給該程序。

注:系統安全狀態:

所謂安全狀態,是指系統能夠按照某種程序推進順序,為每個程序分配其所需要帶的資源,直到滿足每個程序對於資源的最大需求,使得每個程序都可以順利完成。系統安全狀態下所對應的程序的推進順序為安全序列。

執行緒的互斥

我們可以用關鍵字private來保證資料物件只能被本類方法訪問,所以我們只需對方法提出一套機制,來對共享的資料物件進行互斥鎖定,這套機制就是執行緒的互斥使用關鍵字synchronized,有synchronized方法和synchronized塊兩種方法。舉例 模擬對銀行賬戶的訪問款操作 packa...

執行緒的互斥

實現互斥訪問的方式 使用臨界區物件 使用互斥物件和使用訊號量。互斥對應乙個cmutex類的物件,只有擁有互斥物件的執行緒才具有訪問共享資源的許可權。使用互斥物件時必須首先為共享資料定義乙個全域性互斥物件。定義後,呼叫lock 成員函式獲得互斥物件的擁有權,呼叫unlock 釋放擁有權。示例 incl...

執行緒的互斥鎖

1.執行緒的互斥鎖 1.1.初始化 在linux下,執行緒的互斥量資料型別是pthread mutex t.在使用前,要對它進行初始化 對於靜態分配的互斥量,可以把它設定為pthread mutex initializer,或者呼叫pthread mutex init.對於動態分配的互斥量,在申請記...