概述
互斥鎖(Mutex)是一種簡單的通過加鎖的方法來控制對共享資源的存取,一般用於解決線程間資源訪問的唯一性問題.
互斥鎖其實很簡單,它只有兩種狀態:上鎖和解鎖.在同一時刻只能有一個線程掌握某個互斥的鎖,擁有上鎖狀態的線程能夠對共享資源進行操作.若其他線程希望對一個已經上了鎖的互斥鎖上鎖,則該線程就會掛起,直到上鎖的線程釋放掉互斥鎖為止.操作互斥鎖的基本函數與信號量用到的函數相似,主要包括以下這些.
pthread_mutex_init:互斥鎖初始化;
pthread_mute_lock:互斥鎖上鎖(阻塞版);
pthread_mutex_trylock:互斥鎖上鎖(非阻塞版);
pthread_mutex_unlock:互斥鎖解鎖;
pthread_mutex_destory:消除互斥鎖.
線程互斥鎖的數據類型是pthread_mutex_t,在使用前,要對其進行初始化,有下列兩種方法:
靜態初始化:可以把PTHREAD_MUTEX_INITIALIZER常量賦值給靜態分配的互斥鎖變量.
動態初始化:在申請內存(malloc)之後,通過pthread_mute_init進行初始化.注意在釋放內存前需要調用pthread_mutex_destory.
系統調用pthread_mutex_init()
該系統該調用初始化互斥鎖變量mutex.其原型為:
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t*mutex, const pthread_mutexattr_t *mutexattr);
參數mutex:是pthread_mutex_t數據類型的指針;
參數mutexattr:是互斥鎖的屬性,通常只需設置為NULL,即以默認的屬性初始化互斥鎖.
系統調用pthread_mutex_lock()
該系統調用對互斥鎖枷鎖,其原型為:
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t*mutex);
對於一個已上鎖的互斥鎖,若調用pthread_mutex_lock()函數再次加鎖,將使調用線程阻塞,直到互斥鎖被解鎖.調用成功發那會0,失敗返回-1.參數mutex是pthread_mutex_t數據類型的指針。
系統調用pthread_mutex_trylock()
該系統調用對互斥鎖mutex加鎖.其原型為:
#include <pthread.h>
Int pthread_mutex_trylock(pthread_mutex_t*mutex);
對於一個已上鎖的互斥鎖,若調用pthread_mutex_trylock()函數再次加鎖,將返回錯誤EBUSY(已加鎖錯誤),因而不會發生阻塞.對於未上鎖的情況,該函數將對互斥鎖加鎖.調用成功返回0,失敗返回-1.
系統調用pthread_mutex_unlock()
該系統調用解除mutex所指的互斥鎖,其原型為:
#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t*mutex);