Linux下執行緒同步物件 1 互斥量

2021-06-06 13:41:19 字數 1628 閱讀 9849

程序是linux資源分配的物件,linux會為程序分配虛擬記憶體(4g)和檔案控制代碼等資源,是乙個靜態的概念。執行緒是cpu排程的物件,是乙個動態的概念。乙個程序之中至少包含有乙個或者多個執行緒。這些執行緒共享該程序空間的記憶體和檔案控制代碼資源,多個執行緒競爭地獲得這些資源。為了防止多個執行緒訪問資源的不一致性,多執行緒程式設計乙個很重要的任務就是控制好執行緒同步。本文簡單介紹一下linux的同步物件和使用時的一些注意事項。

1、互斥量(mutex)

互斥量本質上講是一把鎖,該鎖保護乙個或者一些資源(記憶體或者檔案控制代碼等資料)。乙個執行緒如果需要訪問該資源必須要獲得互斥量,並對其加鎖。這時如果其他執行緒如果想訪問該資源也必須要獲得該互斥量,但是鎖已經加鎖,所以這些程序只能阻塞,直到獲得該鎖的執行緒解鎖。這時阻塞的執行緒裡面有乙個執行緒獲得該互斥量並加鎖,獲准訪問該資源。其他的執行緒繼續阻塞,周而復始。

linux互斥量控制代碼為pthread_mutex_t。可以以pthread_mutex_initializer初始化乙個互斥量,或者呼叫如下函式動態進行初始化:

#include int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);

銷毀乙個互斥量呼叫如下函式:

#include int pthread_mutex_destroy(pthread_mutex_t *mutex);
對乙個互斥量加鎖和解鎖函式如下:

#include int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

當前執行緒呼叫pthread_mutex_lock函式時,如果該互斥量未加鎖,則當前執行緒獲得該互斥量並解鎖,該函式返回;如果當前該互斥量已經加鎖,則該函式將會阻塞,直到該互斥量解鎖,當前執行緒獲得該互斥量,並加鎖返回。

pthread_mutex_trylock如果互斥量為未加鎖,則當前執行緒將會獲得該互斥量並加鎖。當互斥量為加鎖狀態,該函式將會立即返回錯誤ebusy,不會阻塞當前執行緒。

互斥量的解鎖函式為pthread_mutex_unlock,這樣將會釋放互斥量資源。

另外注意乙個問題就是互斥量死鎖(dead lock)的問題。當乙個互斥量的時候,不會發生互斥量的問題。當有多個互斥量的時候,有可能發生死鎖。例如:有互斥量a,b。假如第乙個執行緒獲得互斥量a,並加鎖,這時他嘗試獲得互斥量b,但是互斥量b已經加鎖,該執行緒被阻塞,等待互斥量b。同時另外乙個執行緒先獲得互斥量b,並已加鎖。這時嘗試獲得互斥量a,發現互斥量a已經加鎖,則阻塞該執行緒,等待互斥量a。這樣出現兩個執行緒互相等待對方已經獲得的訊號量的問題,都處於阻塞狀態,出現死鎖。那麼怎樣解決這種死鎖問題呢?那就是執行緒以同樣的順序獲得互斥量。第乙個執行緒先獲得互斥量a,再獲得互斥量b;第二個執行緒也以同樣的順序獲得互斥量。這樣就不會出現死鎖的狀態了。

但是在一些結構複雜的程式中,很難保證以同樣的順序獲得互斥量,那麼怎樣解決死鎖問題呢?就是以pthread_mutex_trylock來嘗試獲得互斥量,如果不能獲得互斥量,則釋放已經持有的互斥量。過段時間,再次進行同樣的嘗試,這樣可以避免死鎖。

Linux下執行緒同步物件 1 互斥量

程序是linux資源分配的物件,linux會為程序分配虛擬記憶體 4g 和檔案控制代碼等資源,是乙個靜態的概念。執行緒是cpu排程的物件,是乙個動態的概念。乙個程序之中至少包含有乙個或者多個執行緒。這些執行緒共享該程序空間的記憶體和檔案控制代碼資源,多個執行緒競爭地獲得這些資源。為了防止多個執行緒訪...

linux下執行緒同步之互斥鎖

互斥鎖是多執行緒同步的一種方式,當多個執行緒訪問同乙個變數時,最簡單的方法就是使用乙個互斥鎖 mutex 保護這個共享變數,防止出現資源搶占的問題。下面是未加互斥鎖時 include includepthread mutex t mutex pthread mutex initializer 靜態初...

Linux環境下執行緒的互斥

多個執行緒同時訪問共享資料時可能會衝突,這跟前面講訊號時所說的可重入性是同樣的問 題。比如 兩個執行緒都要把某個全域性變數增加1,這個操作在某平台需要三條指令完成 1.從記憶體讀變數值到暫存器 2.暫存器的值加1 3.將暫存器的值寫回記憶體 假設兩個執行緒在多處理器平台上同時執行這三條指令,則可能導...