什麼是訊號量
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...