執行緒同步機制之互斥量

2021-08-07 01:40:31 字數 1598 閱讀 4622

一、互斥量的概念

互斥量(mutex)從概念上來說類似於乙個二進位制訊號量,即初始值為1的訊號量。互斥量被獲取之後就不能再被獲取,因此對互斥體的獲取和釋放操作常常稱為加鎖和解鎖操作。

互斥量只能由獲取它的執行緒進行釋放,如果違反這一原則,則結果是未定義的。

互斥量從本質上說是一把鎖,在訪問共享資源前對互斥量進行加鎖,在訪問完成後釋放互斥量上的鎖。對互斥量進行加鎖以後,任何其他試圖再次對互斥量加鎖的執行緒將會被阻塞直到當前執行緒釋放該互斥量。

二、互斥量的操作

(1)初始化

互斥量用乙個pthread_mutex_t型的變數表示。使用互斥量之前需要對它進行初始化,其介面函式原型如下:

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

mutex引數指向要初始化的互斥量。attr引數指向乙個描述互斥量屬性的結構體。attr引數可以為null,表示使用預設屬性。

(2)操作函式

互斥量的主要操作函式如下:

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()用於對mutex引數指向的互斥量進行加鎖。如果這時互斥量已經被鎖,則呼叫這個函式的執行緒將被阻塞,直到互斥量成為未鎖狀態。函式返回時,表示這個互斥量已經變為已鎖狀態,同時,函式的呼叫者成為這個互斥量的擁有者。

pthread_mutex_trylock()也用於對mutex引數指向的互斥量進行加鎖。如果這時互斥量已經被鎖,則函式以錯誤狀態返回。

pthread_mutex_unlock()用於對mutex引數指向的互斥量進行解鎖。如果這時互斥量是未鎖狀態或不是當前執行緒所擁有的,則結果未定義。 因此,互斥量必須在同一執行緒上成對出現。

(3)互斥鎖的銷毀

互斥量不用以後,應

該使用下面的函式進

行銷毀:

int pthread_mutex_destroy(pthread_mutex_t *mutex);   

(4)利用互斥鎖製作乙個簡單的賣票系統

#include #include #include #include #include int ticket = 100;   // 票

// 互斥鎖

pthread_mutex_t mutex;

// 賣票執行緒

void *sale_ticket(void *v)

printf ("視窗 %d 賣票了一張票 : %d\n", window, ticket);

ticket--;

pthread_mutex_unlock(&mutex); }}

int main()

pthread_exit(null);

// 銷毀互斥鎖

pthread_mutex_destroy(&mutex);

return 0;

}

執行緒管理 互斥量同步機制

互斥量機制 在計算機系統中有許多共享資源不允許使用者並行使用,像印表機這樣的共享裝置被稱為 排它性資源 因為它一次只能由乙個執行流訪問。執行流必須以互斥的方式 執行訪問排它性資源的 互斥量 mutex 又稱為互斥鎖,是一種用來保護臨界區的特殊變數,它可以處於鎖定 locked 狀態,也可以處於解鎖 ...

windows多執行緒同步機制 互斥量

handle createmutex lpsecurity attributes lpmutexattributes,安全屬性 bool binitialowner,初始化的擁有執行緒 lpctstr lpname 名稱 binitialowner true表示當前建立互斥 量的執行緒擁有互斥,fa...

(4 1)Linux執行緒同步機制 互斥量

4.互斥量的操作 5.互斥量的操作總結 乙個任務包含乙個程序以及多個執行緒 全域性變數儲存在進行資料段中,被執行緒所共享。三個步驟如下 併發 兩個執行緒的執行,可以通過os或者os的流水線而實現併發 eg 執行緒a和執行緒b共享乙個全域性變數i,兩個執行緒對i都實現i 1的操作 1 大體過程如下 p...