多執行緒之訊號量

2021-10-07 00:03:39 字數 1302 閱讀 8590

本文的訊號量型別為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 標頭檔案中,所以使用訊號量之前...