多線程編程 ------ 互斥量

1. 建立互斥量

pthreads 使用 pthread_mutex_t 類型的變量來表示互斥量,同時在使用互斥量進行同步前須要先對它進行初始化,能夠用靜態或動態的方式對互斥量進行初始化。

函數

(1)靜態初始化

對於靜態分配的 pthread_mutex_t 變量來講,只要將 PTHREAD_MUTEX_INITIALIZER賦給變量就好了。
spa

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

2)動態初始化

對於動態分配或者不使用默認屬性的互斥變量來講,須要調用 pthread_mutex_int()函數來執行初始化工做。 pthread_mutex_int()函數原型以下:
線程

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

 

 參數 mutex 是一個指向要初始化的互斥量的指針;參數 attr 傳遞 NULL 來初始化一個帶有默認屬性的互斥量,不然就要用相似於線程屬性對象所使用的方法,先建立互斥量屬性對象,再用該屬性對象來建立互斥量。
指針

函數成功返回 0,不然返回一個非 0 的錯誤碼, 表 13.5 列出 pthread_mutex_init 出錯的錯誤碼。

rest

靜態初始化程序一般比調用 pthread_mutex_init 更有效,並且在任何線程開始執行以前,確保變量被初始化一次。

code

2. 銷燬互斥量

銷燬互斥量使用 pthread_mutex_destroy()函數,原型以下:
對象

int pthread_mutex_destroy(pthread_mutex_t *mutex);

 

參數 mutex 指向要銷燬的互斥量。如下代碼銷燬了 mylock 互斥量:
blog

int error;
pthread_mutex_t mylock;
if (error = pthread_mutex_destroy(&mylock))
  fprintf(stderr, "Failed to destroy mylock : %s\n", strerror(error));

 

 

加鎖與解鎖

加鎖

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

 

 解鎖

pthread_mutex_unlock()函數用來釋放指定的互斥量。函數原型以下:
同步

int pthread_mutex_unlock(pthread_mutex_t *mutex);

 

 

死鎖的避免 

當多個線程須要相同的一些鎖, 可是按照不一樣的順序加鎖, 死鎖就很容易發生, 若是能確保全部的線程都是按照相同的順序得到鎖,那麼死鎖就不會發生。 例如,規定程序內有三個互斥鎖的加鎖順序爲 mutexA->mutexB->mutexC,則線程 t1t2t3 線程操做僞代碼以下所示:

相關文章
相關標籤/搜索