執行緒同步之訊號量

2021-09-25 19:33:29 字數 1528 閱讀 6428

什麼是訊號量

linux sem 訊號量是一種特殊的變數,訪問具有原子性, 用於解決程序或執行緒間共享資源引發的同步問題。

使用者態程序對 sem 訊號量可以有以下兩種操作:

等待訊號量:

當訊號量值為 0 時,程式等待;當訊號量值大於 0 時,訊號量減 1,程式繼續執行。

傳送訊號量:

將訊號量值加 1

通過對訊號量的控制,從而實現共享資源的順序訪問。

參考文章:新增鏈結描述

使用語句;

定義乙個區域性變數 sem_t sem;

intsem_init(sem_t *sem, int pshared, unsigned int value); // 初始化 後兩個引數可以是0;// 該函式初始化由 sem 指向的訊號物件,並給它乙個初始的整數值 value。// pshared 控制訊號量的型別,值為 0 代表該訊號量用於多執行緒間的同步,值如果大於 0 表示可以共享,用於多個相關程序間的同步;

intsem_post(sem_t *sem); //unlocks 解鎖 相當於訊號加1

intsem_wait(sem_t *sem); // 當訊號大於零,將不阻塞,然後–;當等於0,那麼就在此一直阻塞狀態;

intsem_destroy(sem_t *sem); // 訊號量**

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

// 訊號量的使用, 程式功能:

// 在主線程中輸入字元後,在子執行緒中列印輸入字元的個數

// 這裡使用了訊號量,在主線程中開鎖,子執行緒中堵塞等待,當解鎖後順序執行。

char buf[200] = ;

int flag ;

sem_t sem;

void *func(void *arg)

}int main(void)

while(scanf("%s", buf))

sem_post(&sem);

} sem_post(&sem);

printf("wait pthread_join.\n");

ret = pthread_join(th, null);

if (ret != 0)

printf("ok pthread_join.\n");

sem_destroy(&sem);

return 0;

}

結果:

jkjljl

number is 6.

sfdsdf

number is 6.

end code end.

wait pthread_join.

ok pthread_join.

執行緒同步之訊號量同步

linux中兩種基本的同步方法是訊號量和互斥量。這兩種方法很相似,而且它們可以相互通過對方來實現。現在有個圖書館,其能容納100人,現在有兩個執行緒a b,a執行緒執行 往圖書管理進入乙個人,b執行緒 從圖書館出來乙個人。那麼為了使得執行緒a在圖書館滿人的時候進入等待,而不是繼續往圖書館裡進人,使得...

執行緒訊號量同步

thread sem.c include include include include define thread number 3 define repeat number 3 define delay time levels 10.0 sem t sem thread number void ...

執行緒同步 訊號量

執行緒同步方法 訊號量不常用,找到個帖子不錯,記錄一下!依賴的標頭檔案 include 函式宣告 sem t 表示訊號量 int sem init sem t sem,int pshared,unsigned int value 名稱 sem init 功能 initialize an unname...