互斥量(也稱為互斥鎖)出自POSIX線程標准,可以用來同步同一進程中的各個線程。當然如果一個互斥量存放在多個進程共享的某個內存區中,那麼還可以通過互斥量來進行進程間的同步。
互斥量,從字面上就可以知道是相互排斥的意思,它是最基本的同步工具,用於保護臨界區(共享資源),以保證在任何時刻只有一個線程能夠訪問共享的資源。
互斥量類型聲明為pthread_mutex_t數據類型,在<bits/pthreadtypes.h>中有具體的定義。
1互斥量初始化和銷毀
#include <pthread.h> int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); int pthread_mutex_destroy (pthread_mutex_t *mutex); 返回值:若成功則返回0,否則返回錯誤編號
上面兩個函數分別由於互斥量的初始化和銷毀。
如果互斥量是靜態分配的,可以通過常量進行初始化,如下:
pthread_mutex_t mlock = PTHREAD_MUTEX_INITIALIZER;
也可以通過調用pthread_mutex_init函數初始化。如果動態分配互斥量(例如通過調用malloc函數),那麼在釋放內存前需要調用pthread_mutex_destroy。
要用默認的屬性初始化互斥量,只需要把attr設置為NULL。
當不在需要使用互斥量時,需要調用pthread_mutex_destroy()銷毀互斥量所占用的資源。
2 互斥量的使用
#include <pthread.h> int pthread_mutex_trylock (pthread_mutex_t *mutex); int pthread_mutex_lock (pthread_mutex_t *mutex); int pthread_mutex_unlock (pthread_mutex_t *mutex); 返回值:若成功則返回0,否則返回錯誤編號
對互斥量進行加鎖,需要調用pthread_mutex_lock,如果互斥量已經上鎖,調用線程將阻塞直到互斥量被解鎖。對互斥量解鎖需要調用pthread_mutex_unlock。
如果線程不希望被阻塞,它可以使用pthread_mutex_trylock嘗試對互斥量進行加鎖。如果調用pthread_mutex_tyrlock時互斥量處於未加鎖狀態,那麼pthread_mutex_trylock將鎖住互斥量,不會出現阻塞並返回0,否則pthread_muxte_trylock就會失敗,不能鎖住互斥量,而返回EBUSY。
這裡要強調的是:互斥量是用於上鎖的,不能用於等待。
簡單說就是,互斥量的使用流程應該是:線程占用互斥量,然後訪問共享資源,最後釋放互斥量。而不應該是:線程占用互斥量,然後判斷資源是否可用,如果不可用,釋放互斥量,然後重復上述過程。這種行為稱為輪轉或輪詢,是一種浪費CPU時間的行為。
查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/