訊號量是什麼?簡單來說,訊號量就是乙個計數值,假設記為s。s > 0時,表示當前可用資源的數目;s < 0時,其絕對值表示等待使用該資源的程序個數。訊號量可作為一種同步手段控制多個程序對資源的訪問。
可以通過pv操作改變訊號量的值。
p操作:
s = s -1;if s >= 0
continue
;else
blocked;
v操作:
s = s + 1;if s > 0
continue
;else
wakeup a blocked process;
訊號量的經典應用當屬「生產者-消費者」問題。生產者-消費者問題(producer-consumer problem)又被稱為有限緩衝問題(bounded-buffer problem)。存在乙個固定大小的緩衝區,生產者程序向緩衝區中存放資料,消費者程序從緩衝區中取走資料。但是緩衝區滿時,生產者不能向其中存放資料;緩衝區空時,消費者不能從緩衝區中取走資料。訊號量是這一問題的常見解決方案。
#include #include#include
#include
#define buffersize 5
#define n 10 //
number of producer
intbuffer[buffersize];
sem_t mutex;
sem_t empty;
sem_t full;
int i = 0
;int j = 0
;void* produce(void *arg)
}void* consume(void *arg)
}int
main()
sleep(1);
sem_destroy(&mutex);
sem_destroy(&empty);
sem_destroy(&full);
return0;
}
用到的函式有:
int sem_init(sem_t *sem, int pshared, unsigned intvalue);
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
int sem_destroy(sem_t *sem);
reference:
訊號量同步多執行緒
windows.waitforsingleobject feventhandle,180000 feventhandle windows.createevent nil,false,false,pchar feventname if feventhandle thandle nil then win...
Linux多執行緒同步 訊號量
同步主線程與子執行緒 子執行緒之間的同步 使用單個訊號量 include include include include include include void ret result thread1 void ret result thread2 sem t sem void thread1fun...
Linux 多執行緒訊號量同步
p操作 v操作 include sem t sem 定義訊號量 sem init 初始化訊號量 sem wait 獲取訊號量,訊號量的數值 1 訪問共享資源 sem post 釋放乙個訊號量,及訊號量的數值 1 sem destroy 如果不再使用訊號量,則銷毀訊號量函式和posix ipc的訊號量...