1.1訊號量簡介
linux下主要分為兩種訊號量,system-v和posix訊號量,posix訊號量又分為無名訊號量和有名訊號量,這裡我們只分享無名訊號量這裡我們主要研究posix訊號量。訊號量是同步的一種方式,常常用於對共享資源的訪問,舉乙個常見的例子,假如乙個停車場有100個停車位,我們將車停在這個停車場需要看一下這個停車場還有多少車位可以停,此時空位就是乙個訊號量,每空乙個車位,訊號量+1,每次停一輛車時訊號量-1.
1.2 訊號量特點
(1)訊號量會使等待資源執行緒進入休眠狀態,所以適合於那些占用資源比較久的場合,比較車倒車狀態的切換。
(2)在驅動中,訊號量不可以用於中斷中,原因是訊號量會引起休眠狀態,中斷不能休眠。
(3)若共享資源的持有時間比較短,則不適合使用訊號量,頻繁的休眠,切換執行緒會導致開銷遠遠大於訊號量所帶來的那點優勢。
2.1 初始化
#include
intsem_init
(sem_t *sem,
int pshared,
unsigned
int value)
;
sem :訊號量變數;
pshared:是否在多個程序中傳遞訊號量,若不是則寫為0;
value:該引數指定訊號量的初始值。如果想要在兩個程序之間使用訊號量,需要確保sem引數指向兩個程序之間共享的記憶體範圍。
2.2 銷毀
#include
intsem_destroy
(sem_t *sem)
;
2.3 p操作
#include
intsem_trywait
(sem_t *sem)
;int
sem_wait
(sem_t *sem)
;returns 0 on success;
on error,
-1 is returned,
如果訊號量的值大於0,則此時會將訊號量的值減1,並且立刻返回,若當前訊號量的值為0,那麼sem_wait會導致執行緒阻塞,直到訊號量的值大於0或者被訊號中斷才返回,而sem_trywait為非阻塞版本,當訊號量為0時,該函式回-1並且將errno置為eagain。
2.4 v操作
#include
intsem_post
(sem_t *sem)
;returns 0 on success;
on error,
-1 is returned,
該函式用於給訊號量計數+1,若此時用sem_wait阻塞的執行緒則被喚醒。
2.5 取值操作
#include
int sem_t getvalue
(sem_t sem,
int*val)
;returns 0 on success;
on error,
-1 is returned,
val返回的值
3.簡單例子
#include
#include
#include
#include
#include
sem_t g_sem;
void
*readthreadfun
(void
*arg)
}void
*writethreadfun
(void
*arg)
}int
main
(int argc,
char
**ar**)
iret =
pthread_create
(&preadid,
null
,readthreadfun,
null);
if(iret !=0)
iret =
pthread_create
(&pwriteid,
null
,writethreadfun,
null);
if(iret !=0)
pthread_join
(preadid,
null);
pthread_join
(pwriteid,
null);
sem_destroy
(&g_sem)
;return0;
}
結果:
read 1 begin
write 1 begin
write 1 end
read 1 end
read 1 begin
write 1 begin
write 1 end
read 1 end..
..
當read執行緒開始時,此時sem的值為0,阻塞此執行緒,write執行緒開始,此時sem的值變為0,解除執行緒阻塞, C多執行緒程式設計 訊號量
這是對由sem指定的訊號量進行初始化,設定好它的共享選項 linux 只支援為0,即表示它是當前程序的區域性訊號量 然後給它乙個初始值value。int sem init sem t sem int pshared,unsigned int value 給訊號量減1,然後等待直到訊號量的值大於0。i...
多執行緒 訊號量
訊號量 semaphore類 建立帶指定許可數的訊號量 semaphore semaphore new semaphore 1 建立乙個許可的訊號量 訊號量用來限制訪問共享數資源的執行緒數。在訪問資源之前,執行緒必須從訊號量獲取許可,在訪問完資源後釋放訊號量。任務通過呼叫訊號量的acquire 方法...
linux 多執行緒程式設計 訊號量的使用
訊號是e.w.dijkstra在二十世紀六十年代末設計的一種程式設計架構。dijkstra的模型與鐵路操作有關 假設某段鐵路是單線的,因此一次只允許一列火車通過。訊號將用於同步通過該軌道的火車。火車在進入單一軌道之前必須等待訊號燈變為允許通行的狀態。火車進入軌道後,會改變訊號狀態,防止其他火車進入該...