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

2021-07-24 22:16:51 字數 2411 閱讀 7109

互斥量機制

在計算機系統中有許多共享資源不允許使用者並行使用,

像印表機這樣的共享裝置被稱為「排它性資源」,

因為它一次只能由乙個執行流訪問。執行流必須以互斥的方式

執行訪問排它性資源的**。

互斥量(mutex),又稱為互斥鎖,是一種用來保護臨界區的特殊變數,

它可以處於鎖定(locked)狀態,也可以處於解鎖(unlocked)狀態:

如果互斥鎖是鎖定的,就是乙個特定的執行緒持有這個互斥鎖:

如果沒有執行緒持有這個互斥鎖,那麼這個互斥鎖就處於解鎖狀態。

//互斥量是最簡單也是最有效的執行緒同步機制。程式可以用它來保護臨界區,

//以獲得對排它性資源的獨佔訪問權。另外,互斥量只能被短時間地持有,

//使用完臨界資源後應立即釋放鎖。 

1.互斥量的操作(程式設計操作)

1.1:建立互斥量,並初始化

(1).靜態初始化

對是靜態分配的 pthread_mutex_t 變數來說值需要將

pthread_mutex_initializer賦給變數就行了。

//eg: pthread_mutex_t mutex = pthread_mutex_initializer;

(2).動態初始化

對動態分配或者不使用預設互斥屬性的互斥變數來說,需要

呼叫 pthread_mutex_int()函式來執行初始化工作。

//eg:int pthread_mutex_init(pthread_mutex_t *restrict mutex,

//                     const pthread_mutexattr_t *restrict attr);

引數: 

@mutex   是乙個指向要初始化的互斥量的指標 

@attr    傳遞 null 來初始化乙個帶有「預設屬性」的互斥量,否則就要用類似於

執行緒屬性物件所使用的方法,先建立互斥量屬性物件,再用該屬性物件來

建立互斥量。

返回值:

成功 返回 0,失敗 返回乙個錯誤碼

2.2銷毀互斥量

銷毀互斥量使用 pthread_mutex_destroy()函式,原型如下:

int pthread_mutex_destroy(pthread_mutex_t *mutex);

//@ mutex 指向要銷毀的互斥量的指標。

2.3加鎖與解鎖

2.3.1執行緒試圖鎖定互斥量的過程稱之為加鎖。

pthreads 中有兩個試圖鎖定互斥量的函式,

pthread_mutex_lock()和 pthread_mutex_ trylock()。

pthread_mutex_lock()函式會一直阻塞到互斥量可用為止,

而 pthread_mutex_trylock() 會嘗試加鎖,通常立即返回。函式原型如下:

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex); 

@ mutex 是需要加鎖的互斥量。

返回值:

成功 返回 0,

失敗 返回錯誤碼,

注:如果,乙個執行緒己持有鎖的情況下,呼叫 pthread_mutex_trylock()函式錯誤碼為 ebusy。

2.3.2解鎖是執行緒將互斥量由鎖定狀態變為解鎖狀態。

pthread_mutex_unlock()函式用來釋放指定的互斥量。函式原型如下:

int pthread_mutex_unlock(pthread_mutex_t *mutex);

1 #include2 #include3 #include4 #include5 #include6 

7 pthread_t tid[2]; //定義執行緒名

8 pthread_mutex_t lock; //定義互斥鎖變數

9 10 void* doprint(void *arg) //執行緒執行函式

11 20 printf("job %d finished\n", id);

21 pthread_mutex_unlock(&lock); //解鎖

22 return null;

23 }

24 25 int main(void)

26 34 while (i < 2)

40 pthread_join(tid[0], null);

41 pthread_join(tid[1], null);

42 pthread_mutex_destroy(&lock); //銷毀互斥量

43 44 return 0;

45 }

執行緒同步機制之互斥量

一 互斥量的概念 互斥量 mutex 從概念上來說類似於乙個二進位制訊號量,即初始值為1的訊號量。互斥量被獲取之後就不能再被獲取,因此對互斥體的獲取和釋放操作常常稱為加鎖和解鎖操作。互斥量只能由獲取它的執行緒進行釋放,如果違反這一原則,則結果是未定義的。互斥量從本質上說是一把鎖,在訪問共享資源前對互...

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...