Linux中的同步技術之互斥量

2021-07-12 02:06:26 字數 2224 閱讀 3634

互斥量從本質上說就像是一把鎖,提供資源的保護訪問,互斥量有兩種狀態,鎖住(lock)與解鎖狀態(unlock),用來保證一段時間內只有乙個執行緒使用該共享資源。

互斥量的資料型別為pthread_mutex_t,如果互斥鎖變數是靜態分配的,那麼一般將其初始化為常值pthread_mutex_initializer, 如:static pthread_mutex_t lock = pthread_mutex_initializer;

r若互斥鎖變數是動態分配的(如呼叫malloc函式)或者說是該互斥鎖分配在共享記憶體區中,則需要用初始化函式

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);

來初始化該互斥鎖變數。

互斥鎖保護的是臨界區,但實際上其保護的臨界區中的被操縱的資料,即就是說,互斥鎖通常用於保護由多個執行緒或多個程序分享的共享資料。

互斥鎖的上鎖與解鎖函式:

int pthread_mutex_lock(pthread_mutex_t *mutex);

該函式是互斥鎖的上鎖(加鎖)函式,成功返回0,失敗返回錯誤編號,使用該函式時如果乙個互斥鎖已經被某個執行緒加鎖鎖住,呼叫該函式就會阻塞呼叫執行緒直到該互斥鎖解鎖為止。引數mutex是互斥鎖變數。

int pthread_mutex_trylock(pthread_mutex_t *mutex);

該函式是互斥鎖的嘗試上鎖函式,成功返回0,失敗返回錯誤編號。該函式是乙個非阻塞函式(就是不阻塞),即就是若乙個互斥鎖變數已經已經被別的執行緒加鎖,則呼叫該函式的執行緒嘗試加鎖,則其加鎖不成功,但是其不會阻塞該執行緒,而是繼續向下執行。若乙個互斥鎖未被加鎖,則其就會加鎖成功。

引數mutex是互斥鎖變數。

int pthread_mutex_unlock(pthread_mutex_t *mutex);

該函式是互斥鎖的解鎖函式,成功返回0,失敗返回錯誤編號。只要臨界區的操作執行完成,就解鎖互斥量。引數mutex是互斥鎖變數。

互斥鎖變數的初始化和銷毀函式:

int pthread_mutex_destroy(pthread_mutex_t *mutex);

該函式是互斥量的銷毀函式,引數為互斥量。成功返回0.失敗返回錯誤編號。

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);

該函式是互斥量的初始化函式,mutex引數為互斥量,attr為互斥量的屬性。成功返回0,失敗返回錯誤編號。該函式用於動態分配或是在共享記憶體區定義的互斥量的初始化。

pthread_mutex_t mutex = pthread_mutex_initializer;

這是互斥量的靜態初始化方法,用於靜態初始化的互斥量。

以下是乙個使用互斥量同步的生產者和消費者程式:

#include #include #include #define buffer_size 6

#define max_size 50

structshared = ;

//生產者程式

void *produce(void *arg)

if(shared.count < buffer_size)

shared.nval++; //生產者產生的資料值增加

shared.count++; //生產者產生的資料個數增加

pthread_cond_signal(&shared.noempty); //給消費者執行緒傳送訊號,告訴消費者執行緒緩衝區中有資料可讀

}else

pthread_mutex_unlock(&shared.mutex); //解鎖互斥量

}}//消費者程式

void *consume(void *arg)

shared.count--; //緩衝區中的元素個數減一

pthread_cond_signal(&shared.nofull); //給生產者執行緒傳送訊號,告訴生產者執行緒緩衝區不滿,可以存入資料

i++; //計數器,用來計數該讀出的資料的個數

}else

pthread_mutex_unlock(&shared.mutex); //解鎖互斥鎖

}}int main()

Linux執行緒同步之互斥量(mutex)

互斥量 也稱為互斥鎖 出自posix 執行緒標準,可以用來同步同一程序中的各個執行緒。當然如果乙個互斥量存放在多個程序共享的某個記憶體區中,那麼還可以通過互斥量來進行程序間的同步。互斥量,從字面上就可以知道是相互排斥的意思,它是最基本的同步工具,用於保護臨界區 共享資源 以保證在任何時刻只有乙個執行...

執行緒同步之互斥量

互斥量 當多個執行緒共享相同的記憶體時,需要每乙個執行緒看到相同的檢視。當乙個執行緒修改變數時,而其他執行緒也可以讀取或者修改這個變數,就需要對這些執行緒同步,確保他們不會訪問到無效的變數 在變數修改時間多於乙個儲存器訪問週期的處理器結構中,當儲存器的讀和寫這兩個週期交叉時,這種潛在的不一致性就會出...

Linux 執行緒同步 互斥量(互斥鎖)

1 執行緒同步的目的是不管執行緒之間的執行如何穿插,其執行結果都是正確的。即保證多執行緒執行下結果的確定性。2 同步就是讓所有執行緒按照一定的規則執行,使得其正確性和效率都有跡可循,即執行緒同步就是對執行緒之間的穿插進行控制。3 每個物件都對應於乙個 互斥鎖 的標記,這個標記用來保證在任一時刻,只能...