做過稍微大一點項目的人都知道,力求程序的穩定性和調度的方便,使用了大量的線程,幾乎每個模塊都有一個專門的線程處理函數。而互斥量與條件變量在線程管理中必不可少,任務間的調度幾乎都是由互斥量與條件變量控制。互斥量的實現與進程中的信號量(無名信號量)是類似的,當然,信號量也可以用於線程,區別在於初始化的時候,其本質都是P/V操作。編譯時,記得加上-lpthread或-lrt哦。
有關Linux進程間通信(消息隊列)見:http://www.linuxidc.com/Linux/2013-01/78676.htm
一、互斥量
1. 初始化與銷毀:
對於靜態分配的互斥量, 可以初始化為PTHREAD_MUTEX_INITIALIZER(等價於pthread_mutex_init(…, NULL))或調用pthread_mutex_init。
對於動態分配的互斥量, 在申請內存(malloc)之後,通過pthread_mutex_init進行初始化, 並且在釋放內存(free)前需要調用pthread_mutex_destroy.
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t*restric attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
返回值:成功則返回0,出錯則返回錯誤編號.
說明:1、如果使用默認的屬性初始化互斥量,只需把attr設為NULL。
2、銷毀一個互斥鎖即意味著釋放它所占用的資源,且要求鎖當前處於開放狀態。由於在Linux中,互斥鎖並不占用任何資源,因此LinuxThreads中的pthread_mutex_destroy()除了檢查鎖狀態以外(鎖定狀態則返回EBUSY)沒有其他動作。
2. 互斥操作:
對共享資源的訪問, 要對互斥量進行加鎖,如果互斥量已經上了鎖, 調用線程會阻塞,直到互斥量被解鎖。在完成了對共享資源的訪問後, 要對互斥量進行解鎖。
int pthread_mutex_lock(pthread_mutex_t *mutex); //P操作:請求資源(+1)
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);//V操作:釋放資源(-1)
返回值:成功則返回0,出錯則返回錯誤編號.
說明:1、想給一個互斥量上鎖,我們調用pthread_mutex_lock。如果mutex已經上鎖,調用的線程將會被阻塞,直至信號量解鎖。
2、具體說一下trylock函數, 這個函數是非阻塞調用模式,也就是說, 如果互斥量沒被鎖住,trylock函數將把互斥量加鎖, 並獲得對共享資源的訪問權限;如果互斥量被鎖住了,trylock函數將不會阻塞等待而直接返回EBUSY, 表示共享資源處於忙狀態。
3、要解鎖一個信號量,我們調用phtread_mutex_unlock。