本文的訊號量型別為posix無名訊號量
1、訊號量基礎知識
2、訊號量的主要用到的函式
int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_destroy(sem_t *sem);
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_post(sem_t *sem);
sem_init():初始化訊號量,其中sem是要初始化的訊號量,訊號量變數用sem_t 定義,例:sem_t a,b,c;定義訊號量a,b,c,pshared表示此訊號量是在程序間共享還是執行緒間共享,由於目前 linux 還沒有實現程序間共享訊號量,所以這個值只能夠取 0,就表示這個訊號量是當前程序的區域性訊號量,value是訊號量的初始值,也就相當於flag的初始值。成功返回0,失敗返回-1。
sem_wait()函式是等待(獲取)訊號量,如果訊號量的值大於0,將訊號量的值減1,立即返回。如果訊號量的值為0,則程序/執行緒阻塞。成功返回0,失敗返回-1。
sem_trywait()函式也是等待訊號量,如果指定訊號量的計數器為0,那麼直接返回eagain錯誤,而不是阻塞等待。
sem_post()函式是釋放訊號量,讓訊號量的值加1。成功返回0,失敗返回-1。
sem_destroy():銷毀訊號量,其中sem是要銷毀的訊號量。只有用sem_init初始化的訊號量才能用sem_destroy()函式銷毀。成功返回0,失敗返回-1。
3、使用訊號量實現迴圈列印n個abc
#include#includeusing namespace std;
sem_t sema,semb,semc;
pthread_t pa,pb,pc;
void* printa(void* arg)
pthread_exit(null);//退出執行緒
}void* printb(void* arg)
pthread_exit(null);//退出執行緒
}void* printc(void* arg)
pthread_exit(null);//退出執行緒
}int main()
}
**的執行環境是linux,在終端使用g++ name.cpp -o test -lpthread -static
使用函式pthread_create建立執行緒,給執行緒函式傳遞引數n
使用函式pthread_join**執行緒
多執行緒之訊號量 Samephore
訊號量相當於乙個計數器,記錄乙個共享資源被訪問執行緒的個數 好比有兩個或者更多個辦事視窗,他們都做同一件事 假設有5個視窗,五個視窗都沒人訪問的時候計數器為5 有乙個視窗被占用計數器減1,為4 全部被占用則計數器為0 這時候其他人想要訪問就必須等待占用結束後計數器加1 handle winapi c...
linux多執行緒之posix訊號量
1.在多工作業系統中,通常資源都是固定數量可用的,比如印表機這個外設 但是需要使用該資源的任務有很多,這時就可以使用到訊號量來協調資源的使用了 當然在資源內部用鎖也可以達到同樣的效果 2.訊號量有被作業系統實現為pv操作 p passeren 消耗資源,對訊號量做減一操作 v vrijgeven 釋...
linux 多執行緒之訊號量 sem init
linux sem 訊號量是一種特殊的變數,訪問具有原子性,用於解決程序或執行緒間共享資源引發的同步問題。使用者態程序對 sem 訊號量可以有以下兩種操作 通過對訊號量的控制,從而實現共享資源的順序訪問。linux 訊號量相關函式都宣告標頭檔案 semaphore.h 標頭檔案中,所以使用訊號量之前...