訊號量廣泛用於程序或執行緒間的同步和互斥(一般用於執行緒,程序間常用有名管道),訊號量本質上是乙個非負的整數計數器,它被用來控制對公共資源的訪問。程式設計時可根據操作訊號量值的結果判斷是否對公共資源具有訪問的許可權,當訊號量值大於 0 時,則可以訪問,否則將阻塞。pv 原語是對訊號量的操作,一次 p 操作使訊號量減1,一次 v 操作使訊號量加1。
用於程序或執行緒間互斥:
初始化訊號量為1;
執行需要互斥的操作前先進行p操作(減 1),其他執行緒或程序會阻塞在這裡;
執行完後進行v操作(加 1),其他程序或執行緒可訪問。
用於程序或執行緒間同步:
#include /* 注意:編譯訊號量操作函式時,需要加上引數-lpthread。
訊號量資料型別為:sem_t。 */
/* 建立乙個訊號量並初始化它的值。乙個無名訊號量在被使用前必須先初始化。*/
int sem_init(sem_t *sem, int pshared, unsigned int value);
/* 引數:
value:訊號量的初始值。
*//* 返回值:
成功:0
失敗:-1
*//* 將訊號量的值減 1。操作前,先檢查訊號量(sem)的值是否為 0,若訊號量為 0,
此函式會阻塞,直到訊號量大於 0 時才進行減 1 操作。*/
int sem_wait(sem_t *sem);
/* 引數:
*//* 返回值:
成功:0
失敗:-1
*/int sem_trywait(sem_t *sem);
/* 以非阻塞的方式來對訊號量進行減 1 操作。若操作前,訊號量的值等於 0,
則對訊號量的操作失敗,函式立即返回。*/
/* 將訊號量的值加 1 並發出訊號喚醒等待執行緒(sem_wait())。*/
int sem_post(sem_t *sem);
/* 引數:
*//* 返回值:
成功:0
失敗:-1
*//* 獲取 sem 標識的訊號量的值,儲存在 sval 中。*/
int sem_getvalue(sem_t *sem, int *sval);
/* 引數:
*//* 返回值:
成功:0
失敗:-1
*//* 刪除 sem 標識的訊號量。*/
int sem_destroy(sem_t *sem);
/* 引數:
*//* 返回值:
成功:0
失敗:-1
*/
#include #include #include #include /* 定義乙個訊號量 */
sem_t sem;
void* call_back(void* arg)
putchar(' ');
sem_post(&sem); //加一操作,後面的執行緒可以從sem_wait()開始往下執行
}int main()
╭─lingyun@manjaro ~/document/codes
╰─➤ vim exam.c
╭─lingyun@manjaro ~/document/codes
╰─➤ gcc exam.c -lpthread
╭─lingyun@manjaro ~/document/codes
╰─➤ ./a.out
hello world //如果不互斥,這幾個字母就會亂序輸出
#include #include #include #include sem_t sem1, sem2;
void* call_back1(void* arg)
void* call_back2(void* arg)
int main()
╭─lingyun@manjaro ~/document/codes
╰─➤ gcc exam.c -lpthread
╭─lingyun@manjaro ~/document/codes
╰─➤ ./a.out
hello world //用同步規定先列印 hello, 再列印 world
訊號量 二值訊號量
訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...
python訊號量 Python訊號量
python訊號量教程 訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而 python訊號量與互斥鎖的關係 訊號量的乙個特殊用...
程序間通訊 POSIX 有名訊號量與無名訊號量
在 posix 系統中,程序間通訊是乙個很有意思的話題。posix訊號量程序是3種 ipc inter process communication 機制之一,3種 ipc 機制源於 posix.1 的實時擴充套件。single unix specification 將3種機制 訊息佇列,訊號量和共享...