號量(semaphore)
訊號量是e.w.dijkstra提出的方法,它使用乙個整型變數來累計喚醒次數,供以後使用。乙個訊號量的取值可以為0,或者為正值。
訊號量有兩種操作:
p(wait):檢查其值是否大於0,若大於0,則將其值減1; 若等於0:則程序將睡眠。
v(signal):訊號量的值加1
互斥量(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
向多個執行緒發訊號來讓它們全部喚醒
訊號量與互斥量的區別
摘自:
1. 互斥量用於執行緒的互斥,訊號線用於執行緒的同步。
這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別。
2. 互斥量值只能為0/1,訊號量值可以為非負整數。
也就是說,乙個互斥量只能用於乙個資源的互斥訪問,它不能實現多個資源的多執行緒互斥問題。訊號量可以實現多個同類資源的多執行緒互斥和同步。當訊號量為單值訊號量是,也可以完成乙個資源的互斥訪問。
3. 互斥量的加鎖和解鎖必須由同一執行緒分別對應使用,訊號量可以由乙個執行緒釋放,另乙個執行緒得到。
互斥:是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。
同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源
訊號量與互斥鎖
訊號量與普通整型變數的區別 訊號量 semaphore 是非負整型變數,除了初始化之外,它只能通過兩個標準原子操作 wait semap signal semap 來進行訪問 操作也被成為pv原語 p 於dutch proberen 測試 v 於 dutch verhogen 增加 而普通整型變數則...
訊號量與互斥鎖
原文 訊號量與普通整型變數的區別 訊號量 semaphore 是非負整型變數,除了初始化之外,它只能通過兩個標準原子操作 wait semap signal semap 來進行訪問 操作也被成為pv原語 p 於dutch proberen 測試 v 於 dutch verhogen 增加 而普通整型...
訊號量與互斥鎖
訊號量與普通整型變數的區別 訊號量 semaphore 是非負整型變數,除了初始化之外,它只能通過兩個標準原子操作 wait semap signal semap 來進行訪問 操作也被成為pv原語 p 於dutch proberen 測試 v 於 dutch verhogen 增加 而普通整型變數則...