Posix多執行緒程式設計學習筆記(四) 互斥量(1)

2021-08-23 13:33:47 字數 4480 閱讀 2141

一、什麼是互斥鎖

另一種在多執行緒程式中同步訪問手段是使用互斥量。程式設計師給某個物件加上一把「鎖」,每次只允許乙個執行緒去訪問它。如果想對**關鍵部分的訪問進行控制,你必須在進入這段**之前鎖定一把互斥量,在完成操作之後再開啟它。

互斥量函式有

pthread_mutex_init

初始化乙個互斥量

pthread_mutex_lock

給乙個互斥量加鎖

pthread_mutex_trylock

加鎖,如果失敗不阻塞

pthread_mutex_unlock 解鎖

可以通過使用pthread

的 互斥介面保護資料,確保同一時間只有乙個執行緒訪問資料。互斥量從本質上說是一把鎖,在訪問共享資源前對互斥量進行加鎖,在訪問完成後釋放互斥量上的鎖。對 互斥量進行加鎖以後,任何其他試圖再次對互斥量加鎖的執行緒將會被阻塞直到當前執行緒釋放該互斥鎖。如果釋放互斥鎖時有多個執行緒阻塞,所以在該互斥鎖上的阻塞 執行緒都會變成可進行狀態,第乙個變成執行狀態的執行緒可以對互斥量加鎖,其他執行緒在次被阻塞,等待下次執行狀態。

互斥量用pthread_mutex_t

資料型別來表示,在使用互斥量以前,必須首先對它進行初始化,可以把它置為常量pthread_mutex_initializer(

只對靜態分配的互斥量)

,也可以通過呼叫pthread_mutex_init

函式進行初始化,如果動態地分配互斥量,那麼釋放記憶體前需要呼叫pthread_mutex_destroy.

二、初始化/

**互斥鎖1

. 名稱::

pthread_mutexattr_init

功能:

初始化互斥鎖。

標頭檔案:

#include

函式原形:

int pthread_mutex_init(pthread_mutex_t * mutex,

const pthread_mutex_t *attr);

引數:

mutex

互斥量 attr

互斥鎖屬性

返回值:

若成功則返回0

,否則返回錯誤編號。

mutex

是我們要鎖住的互斥量,attr

是互斥鎖的屬性,可用相應的函式修改,我們在下章介紹,要用預設的屬性初始化互斥量,只需把attr

設定為null。

2.名稱::

pthread_mutex_destroy

功能:

釋放對互斥變數分配的資源

標頭檔案:

#include

函式原形:

int pthread_mutex_destroy(pthread_mutex_t *mutex);

引數:

返回值:

若成功則返回0

,否則返回錯誤編號。

三、對互斥量加減鎖

3

. 名稱::

pthread_mutex_lock/ pthread_mutex_trylock/ pthread_mutex_unlock

功能:

對互斥量加/減鎖

標頭檔案:

#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);

引數:

返回值:

若成功則返回0

,否則返回錯誤編號。

對互斥量進行加鎖,需要呼叫pthread_mutex_lock,

如果互斥量已經上鎖,呼叫執行緒阻塞直至互斥量解鎖。對互斥量解鎖,需要呼叫pthread_mutex_unlock.

如果執行緒不希望被阻塞,他可以使用pthread_mutex_trylock

嘗試對互斥量進行加鎖。如果呼叫pthread_mutex_trylock

時互斥量處於未鎖住狀態,那麼pthread_mutex_trylock

將鎖住互斥量,否則就會失敗,不能鎖住互斥量,而返回ebusy。

下面試例子可以證明對互斥量加鎖的必要性:

我們先來看不加鎖的程式。

#inlcude

#include

#inlcude

#include

viid *thread_function(void *arg);

int run_now=1; /*

用run_now

代表共享資源*/

int main()

while(print_count1++<5)

else }

pthread_join(a_thread,null); /*

等待子執行緒結束*/

exit(0);

}void *thread_function(void *arg)

else }

pthread_exit(null);

}執行上面程式的執行結果為:

function thread is sleep

main thread is run

main thread is sleep

main thread is sleep

function thread is run

function thread is sleep

main thread is run

main thread is sleep

function thread is run

function thread is sleep

我們可以看到main

執行緒和function

執行緒是交替執行的。它們都可以對run_now

進行操作。

下面是加鎖的程式。

#inlcude

#include

#inlcude

viid *thread_function(void *arg);

int run_now=1; /*

用run_now

代表共享資源*/

pthread_mutex_t work_mutex; /*

定義互斥量*/

int main()

if(pthread_create(&a_thread,null,thread_function,null)!=0) /*

建立新執行緒*/

if(pthread_mutex_lock(&work_mutex)!=0) /*

對互斥量加鎖*/

else

printf(「main lock/n」);

while(print_count1++<5)

else }

if(pthread_mutex_unlock(&work_mutex)!=0) /*

對互斥量解鎖*/

else

printf(「main unlock/n」);

pthread_mutex_destroy(&work_mutex); /*

收回互斥量資源*/

pthread_join(a_thread,null); /*

等待子執行緒結束*/

exit(0);

}void *thread_function(void *arg)

else

printf(「function lock/n」);

while(print_count2++<5)

else }

if(pthread_mutex_unlock(&work_mutex)!=0) /*

對互斥量解鎖*/

else

printf(「function unlock/n」);

pthread_exit(null);

}下面是執行結果:

main lock

main thread is run

main thread is sleep

main thread is sleep

main thread is sleep

main thread is sleep

main unlock

function lock

function thread is run

function thread is sleep

function thread is sleep

function thread is sleep

function thread is sleep

function unlock

我們從執行結果可以看到,當主程序把互斥量鎖住後,子程序就不能對共享資源進行操作了。

Posix多執行緒程式設計學習筆記(四) 互斥量(1)

一 什麼是互斥鎖 另一種在多執行緒程式中同步訪問手段是使用互斥量。程式設計師給某個物件加上一把 鎖 每次只允許乙個執行緒去訪問它。如果想對 關鍵部分的訪問進行控制,你必須在進入這段 之前鎖定一把互斥量,在完成操作之後再開啟它。互斥量函式有 pthread mutex init 初始化乙個互斥量 pt...

Posix多執行緒程式設計學習筆記(四) 互斥量(2)

四 互斥鎖屬性 執行緒和執行緒的同步物件 互斥量,讀寫鎖,條件變數 都具有屬性。在修改屬性前都需要對該結構進行初始化。使用後要把該結構 我們用pthread mutexattr init函式對pthread mutexattr結構進行初始化,用pthread mutexattr destroy函式對...

Posix多執行緒程式設計學習筆記(五) 條

一 什麼是條件變數 與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條...