當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 信號量是什么,讓你幾分鐘弄懂
在了解和學(xué)習(xí)信號量之前,我們需要明確一點(diǎn),信號量和信號不同,切勿將信號和信號量混淆,因?yàn)槎吒静皇且粋(gè)概念。
一、 什么是信號量?
為了防止出現(xiàn)因多個(gè)程序同時(shí)訪問一個(gè)共享資源而引發(fā)的一系列問題,我們需要一種方法,它可以通過生成并使用令牌來授權(quán),在任何時(shí)刻只能有一個(gè)執(zhí)行線程訪問代碼的臨界區(qū)域。臨界區(qū)域是指執(zhí)行數(shù)據(jù)更新的代碼需要獨(dú)占式地執(zhí)行。
信號量是一個(gè)特殊的變量,程序?qū)ζ湓L問都是原子操作,且只提供它等待或者發(fā)送兩種操作,也就是P操作和V操作。何為P/V操作:舉個(gè)例子,我們平常最常見也最簡單的信號形式——二值信號量。P操作則是對等待的信號量的值進(jìn)行減一操作,而V操作則是對某一個(gè)信號量執(zhí)行加一操作。這里我們暫時(shí)也僅針對于二值信號量來討論。
二、信號量的工作原理
信號量只能進(jìn)行兩種操作等待和發(fā)送信號,即P操作和V操作,他們的行為是這樣的:
P:如果信號量的值大于零,就給它減1;如果它的值為零,就掛起該進(jìn)程的執(zhí)行直到
該信號量的值不為一為止。
V:如果有其他進(jìn)程因等待該信號量而被掛起,就讓它恢復(fù)運(yùn)行,如果沒有進(jìn)程因等待該 信號量而掛起,就給它加1。
三、 POSIX信號量相關(guān)函數(shù)
int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
sem_init可以設(shè)置信號量的初始值和初始狀態(tài),sem_wait則會(huì)等待指定信號量,如果該值為0,則等待,否則對信號量的值減一并獲取資源,即P操作。sem_post則對指定信號量的值加一,即V操作。
四、 總結(jié)
信號量是一個(gè)特殊的變量,程序?qū)ζ湓L問都是原子操作,且只允許對它進(jìn)行等待(即P(信號變量))和發(fā)送(即V(信號變量))信息操作。我們通常通過信號來解決多個(gè)進(jìn)程或線程對同一資源的訪問競爭的問題。