semaphore工作原理與應用

2021-09-12 22:02:46 字數 1653 閱讀 3050

一、訊號量和互斥鎖(mutex)的區別:互斥鎖只允許乙個執行緒進入臨界區,而訊號量允許多個執行緒同時進入臨界區。

semaphore分為單值多值兩種,前者只能被乙個執行緒獲得,後者可以被若干個執行緒獲得。

工作原理:以乙個停車場是運作為例。為了簡單起見,假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛不受阻礙的進入,然後放落車攔,剩下的車則必須在入口等待,此後來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知後,開啟車攔,放入一輛,如果又離開兩輛,則又可以放入兩輛,如此往復。

在這個停車場系統中,車位是公共資源,每輛車好比乙個執行緒,看門人起的就是訊號量的作用。

更進一步,訊號量的特性如下:訊號量是乙個非負整數(車位數),所有通過它的執行緒(車輛)都會將該整數減一(通過它當然是為了使用資源),當該整數值為零時,所有試圖通過它的執行緒都將處於等待狀態。在訊號量上我們定義兩種操作wait(等待)release(釋放)。 當乙個執行緒呼叫wait(等待)操作時,它要麼通過然後將訊號量減一,要麼一直等下去,直到訊號量大於一或超時。release(釋放)實際上是在訊號量上執行加操作,對應於車輛離開停車場,該操作之所以叫做「釋放」是因為加操作實際上是釋放了由訊號量守護的資源。

note:臨界區:每個程序中訪問臨界資源的那段**稱為臨界區(critical section)(臨界資源是一次僅允許乙個程序使用的共享資源)。每次只准許乙個程序進入臨界區,進入後不允許其他程序進入。不論是硬體臨界資源,還是軟體臨界資源,多個程序必須互斥地對它進行訪問。

不多做解釋,要使用訊號量同步,需要包含標頭檔案semaphore.h

二、主要用到的函式:

1.sem_init

int sem_init(sem_t *sem, int pshared, unsigned int value);
其中sem是要初始化的訊號量,pshared表示此訊號量是在程序間共享還是執行緒間共享,pshared控制訊號量的型別,如果其值為0,就表示這個訊號量是當前程序的區域性訊號量,否則訊號量就可以在多個程序之間共享;value是訊號量的初始值,一般設定為0。呼叫成功時返回0,失敗返回-1.

該函式初始化由sem指向的訊號物件,設定它的共享選項,並給它乙個初始的整數值,可通過如下聯合體設定:

sem_t sem_event;
2. sem_wait
int sem_wait(sem_t *sem);
等待訊號量,如果訊號量的值大於0,將訊號量的值減1,立即返回。如果訊號量的值為0,則執行緒阻塞。相當於p操作。成功返回0,失敗返回-1, 原子操作。

3. sem_post

int sem_post(sem_t *sem);
釋放訊號量,讓訊號量的值加1。相當於v操作,原子操作。

4. sem_destroy

int sem_destroy(sem_t *sem);
其中sem是要銷毀的訊號量。只有用sem_init初始化的訊號量才能用sem_destroy銷毀。

Semaphore原理分析

訊號量,個人理解它向乙個限制的意思,比如超過了某一設定好的標準就會無效,比如我們的在大學上學的時候,每年都舉行運動會,比如男子400公尺比賽,4個跑到,比如報名不足4個人則我們可以一次性跑完,但是如果多了,那麼多的只能等上一組跑完之後才能進行。閒話不多說,看下面幾個重要的實現。訊號量底層實際使用了a...

Semaphore原理分析

aqs 共享模式分析 訊號量semaphore是乙個控制訪問多個共享資源的計數器,和countdownlatch一樣,本質上是一種共享鎖。舉個例子,還是生產者消費者的例子,假設緩衝區的大小是100,然後可以實現多個生產者和消費者同時進行工作,只要100個資源沒有使用完,生產者就可以繼續生產,而在之前...

Java併發 Semaphore原理解析

今天主要是寫關於semaphore的原理及解析 一 semaphore的介紹 訊號量為多執行緒協作提供更強大的控制。從廣義上來講,是鎖的增強,synchronized reentrantlock只能對乙個執行緒加鎖,而訊號量可以對多個執行緒進行控制。二 semaphore的使用 semaphore ...