1. 程式人生 > >訊號量與互斥鎖

訊號量與互斥鎖

訊號量(semaphore)

訊號量是E.W.Dijkstra提出的方法,它使用一個整型變數來累計喚醒次數,供以後使用。一個訊號量的取值可以為0,或者為正值。
訊號量有兩種操作:

  • P(wait):檢查其值是否大於0,若大於0,則將其值減1; 若等於0:則程序將睡眠。
  • V(signal):訊號量的值加1

PV操作是原子操作:原子操作指一組相關聯的操作要麼都不間斷地執行,要麼都不執行。

互斥量(mutex)

如果不需要訊號量的技術能力,有時可以使用訊號量的一個簡化版本,稱為互斥量。
互斥量是一個可以處於兩態之一的變數:解鎖和加鎖,這樣只需要用一個二進位制位表示它,實際上通常使用一個整型量,0表示解鎖,其他所有值表示加鎖。
互斥量使用有兩個過程:

  • mutex_lock:當一個執行緒(或程序)需要訪問臨界區時,如果該互斥量當前是解鎖的(即臨界區可用)此呼叫成功,呼叫執行緒可以自由進入該臨界區。
  • mutex_unlock:如果該互斥量已經加鎖,呼叫執行緒被阻塞,直到在臨界區中的執行緒完成並呼叫mutex_unlock。

與互斥量相關的主要函式:

執行緒呼叫 描述
pthread_mutex_init 建立一個互斥量
pthread_mutex_destroy 撤銷一個已存在的互斥量
pthread_mutex_lock 獲得一個鎖或阻塞
pthread_mutex_trylock 獲得一個鎖或失敗
pthread_mutex_unlock 釋放一個鎖

除互斥量之外,pthread提供了另一種同步機制:條件變數。互斥量在允許或阻塞對臨界區的訪問上是很有用的,條件變數則允許執行緒由於一些未達到的條件而阻塞。絕大部分情況下這兩種方法是一起使用的。

與條件變數相關函式

執行緒呼叫 描述
pthread_cond_init 建立一個條件變數
pthread_cond_destroy 撤銷一個條件變數
pthread_cond_wait 阻塞以等待一個訊號
pthread_cond_signal 向另一個執行緒發訊號來喚醒它
pthread_cond_broadcast 向多個執行緒發訊號來讓它們全部喚醒

訊號量與互斥量的區別

摘自:
http://www.cnblogs.com/diyingyun/archive/2011/12/04/2275229.html
1. 互斥量用於執行緒的互斥,訊號線用於執行緒的同步。
這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別。
2. 互斥量值只能為0/1,訊號量值可以為非負整數。
也就是說,一個互斥量只能用於一個資源的互斥訪問,它不能實現多個資源的多執行緒互斥問題。訊號量可以實現多個同類資源的多執行緒互斥和同步。當訊號量為單值訊號量是,也可以完成一個資源的互斥訪問。
3. 互斥量的加鎖和解鎖必須由同一執行緒分別對應使用,訊號量可以由一個執行緒釋放,另一個執行緒得到。

互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。
同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源