互斥量機制
在計算機系統中有許多共享資源不允許使用者並行使用,
像印表機這樣的共享裝置被稱為「排它性資源」,
因為它一次只能由乙個執行流訪問。執行流必須以互斥的方式
執行訪問排它性資源的**。
互斥量(mutex),又稱為互斥鎖,是一種用來保護臨界區的特殊變數,
它可以處於鎖定(locked)狀態,也可以處於解鎖(unlocked)狀態:
如果互斥鎖是鎖定的,就是乙個特定的執行緒持有這個互斥鎖:
如果沒有執行緒持有這個互斥鎖,那麼這個互斥鎖就處於解鎖狀態。
//互斥量是最簡單也是最有效的執行緒同步機制。程式可以用它來保護臨界區,
//以獲得對排它性資源的獨佔訪問權。另外,互斥量只能被短時間地持有,
//使用完臨界資源後應立即釋放鎖。
1.互斥量的操作(程式設計操作)
1.1:建立互斥量,並初始化
(1).靜態初始化
對是靜態分配的 pthread_mutex_t 變數來說值需要將
pthread_mutex_initializer賦給變數就行了。
//eg: pthread_mutex_t mutex = pthread_mutex_initializer;
(2).動態初始化
對動態分配或者不使用預設互斥屬性的互斥變數來說,需要
呼叫 pthread_mutex_int()函式來執行初始化工作。
//eg:int pthread_mutex_init(pthread_mutex_t *restrict mutex,
// const pthread_mutexattr_t *restrict attr);
引數:
@mutex 是乙個指向要初始化的互斥量的指標
@attr 傳遞 null 來初始化乙個帶有「預設屬性」的互斥量,否則就要用類似於
執行緒屬性物件所使用的方法,先建立互斥量屬性物件,再用該屬性物件來
建立互斥量。
返回值:
成功 返回 0,失敗 返回乙個錯誤碼
2.2銷毀互斥量
銷毀互斥量使用 pthread_mutex_destroy()函式,原型如下:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
//@ mutex 指向要銷毀的互斥量的指標。
2.3加鎖與解鎖
2.3.1執行緒試圖鎖定互斥量的過程稱之為加鎖。
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);
@ mutex 是需要加鎖的互斥量。
返回值:
成功 返回 0,
失敗 返回錯誤碼,
注:如果,乙個執行緒己持有鎖的情況下,呼叫 pthread_mutex_trylock()函式錯誤碼為 ebusy。
2.3.2解鎖是執行緒將互斥量由鎖定狀態變為解鎖狀態。
pthread_mutex_unlock()函式用來釋放指定的互斥量。函式原型如下:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
1 #include2 #include3 #include4 #include5 #include6
7 pthread_t tid[2]; //定義執行緒名
8 pthread_mutex_t lock; //定義互斥鎖變數
9 10 void* doprint(void *arg) //執行緒執行函式
11 20 printf("job %d finished\n", id);
21 pthread_mutex_unlock(&lock); //解鎖
22 return null;
23 }
24 25 int main(void)
26 34 while (i < 2)
40 pthread_join(tid[0], null);
41 pthread_join(tid[1], null);
42 pthread_mutex_destroy(&lock); //銷毀互斥量
43 44 return 0;
45 }
執行緒同步機制之互斥量
一 互斥量的概念 互斥量 mutex 從概念上來說類似於乙個二進位制訊號量,即初始值為1的訊號量。互斥量被獲取之後就不能再被獲取,因此對互斥體的獲取和釋放操作常常稱為加鎖和解鎖操作。互斥量只能由獲取它的執行緒進行釋放,如果違反這一原則,則結果是未定義的。互斥量從本質上說是一把鎖,在訪問共享資源前對互...
windows多執行緒同步機制 互斥量
handle createmutex lpsecurity attributes lpmutexattributes,安全屬性 bool binitialowner,初始化的擁有執行緒 lpctstr lpname 名稱 binitialowner true表示當前建立互斥 量的執行緒擁有互斥,fa...
(4 1)Linux執行緒同步機制 互斥量
4.互斥量的操作 5.互斥量的操作總結 乙個任務包含乙個程序以及多個執行緒 全域性變數儲存在進行資料段中,被執行緒所共享。三個步驟如下 併發 兩個執行緒的執行,可以通過os或者os的流水線而實現併發 eg 執行緒a和執行緒b共享乙個全域性變數i,兩個執行緒對i都實現i 1的操作 1 大體過程如下 p...