訊號量與互斥鎖

2021-08-18 14:33:23 字數 1559 閱讀 6702

號量(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 增加 而普通整型變數則...