執行緒同步機制之訊號量

2021-08-07 01:36:20 字數 1839 閱讀 8187

一、什麼是訊號量

執行緒的訊號量與程序間通訊中使用的訊號量的概念是一樣,它是一種特殊的變數,它可以被增加或減少,但對其的關鍵訪問被保證是原子操作。如果乙個程式中有多個執行緒試圖改變乙個訊號量的值,系統將保證所有的操作都將依次進行。

而只有0和1兩種取值的訊號量叫做二進位制訊號量,在這裡將重點介紹。而訊號量一般常用於保護一段**,使其每次只被乙個執行執行緒執行。我們可以使用二進位制訊號量來完成這個工作

(原子操作:一組不會被打打斷的操作,一旦開始,就執行到結束)

二、訊號量的操作

訊號量的函式都以sem_開頭,執行緒中使用的基本訊號量函式有4個,它們都宣告在標頭檔案semaphore.h中。

(1)建立訊號量

#include

int sem_init(sem_t *sem, int pshared, unsigned int value);

功能:初始化乙個未命名的訊號量(unnamed semaphore)。

sem指向需要初始化的訊號量(sem_t型別)。

value指定訊號量的初始值。

pshared表明訊號量是在乙個程序的多個執行緒之間共享還是在多個程序之間共享。若pshared為0,訊號量被乙個程序的多個執行緒共享,此時應該將訊號量(sem_t)置於所有執行緒可見的位置(全域性變數或動態分配)。

執行成功返回0,出錯返回-1,並設定errno。

注意:初始化乙個已經初始化了的訊號量將導致未定義的行為。

(2)訊號量的控制

#include

int sem_post(sem_t *sem);   // v

int sem_wait(sem_t *sem);   // p

sem_post的作用是以原子操作的方式給訊號量的值加1

sem_wait函式以原子操作的方式將訊號量的值減1,但它會等待直到訊號量有個非零值才會開始減法操作。例如,對值為2的訊號量呼叫sem_wait,執行緒將繼續執行,但訊號量的值會減到1。如果對值為0的訊號量呼叫sem_wait,這個函式就會等待,直到有其它執行緒增加了該訊號量的值使其不再為0為止。

如果兩個執行緒同時在sem_wait函式上等待同乙個訊號量變為非零值,那麼當該訊號量被第三個執行緒增加1時,只有其中乙個等待執行緒將開始對訊號量減1,然後繼續執行,另外乙個執行緒還將繼續等待。

補充:還有另外乙個訊號量函式sem_trywait,它是sem_wait的非阻塞版本。

(3)訊號量的銷毀

#include

int sem_destroy(sem_t *sem);

這個函式的作用是,用完訊號量後對它進行清理,清理該訊號量所擁有的資源。如果你試圖清理的訊號量正被一些執行緒等待,就會收到乙個錯誤。

(4)應用:生產者與消費者模型

多執行緒併發應用程式有乙個經典的模型,即生產者/消費者模型。系統中,產生訊息的是生產者,處理訊息的是消費者,消費者和生產者通過乙個緩衝區進行訊息傳遞。生產者產生訊息後提交到緩衝區,然後通知消費者可以從中取出訊息進行處理。消費者處理完資訊後,通知生產者可以繼續提供訊息。

要實現這個模型,關鍵在於消費者和生產者這兩個執行緒進行同步。也就是說:只有緩衝區中有訊息時,消費者才能夠提取訊息;只有訊息已被處理,生產者才能產生訊息提交到緩衝區。

#include #include #include #include #include // 訊號量和緩衝區

struct data

;struct data msg;

// 生產者執行緒工作函式

void *produce(void *v);

while (1) }

// 消費者執行緒工作函式

void *consum(void *v)

}int main()

linux核心同步機制之訊號量

定義 如果有乙個任務試圖獲得已經被占用的訊號量時,訊號量會將其推進乙個等待佇列,使其睡眠,當持有訊號量的程序將訊號量釋放以後,再喚醒該任務,並獲得該訊號量。標頭檔案head.h ifndef head h define head h include include include include e...

Linux多執行緒程式設計入門 同步機制 訊號量

int sem init sem t sem,int pshared,unsigned int value pshared 控制訊號量的型別,0表示這個訊號量是當前程序的區域性訊號量,否則,這個訊號量就可以在多個程序之間共享。value 訊號量的初始值。int sem post sem t sem ...

linux同步機制之訊號量down 和up

linux核心的訊號量在概念和原理上和使用者態的system v的ipc機制訊號量是相同的,不過他絕不可能在核心之外使用,因此他和system v的ipc機制訊號量毫不相干。訊號量在建立時需要設定乙個初始值,表示同時能有幾個任務能訪問該訊號量保護的共享資源,初始值為1就變成互斥鎖 mutex 即同時...