pthreads 使用 pthread_mutex_t 類型的變量來表示互斥量,同時在使用互斥量進行同步前須要先對它進行初始化,能夠用靜態或動態的方式對互斥量進行初始化。
函數
對於靜態分配的 pthread_mutex_t 變量來講,只要將 PTHREAD_MUTEX_INITIALIZER賦給變量就好了。
spa
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
對於動態分配或者不使用默認屬性的互斥變量來講,須要調用 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
銷燬互斥量使用 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,則線程 t1、 t2、 t3 線程操做僞代碼以下所示: