互斥锁、条件变量、信号量浅析
互斥鎖、條件變量、信號量淺析
互斥鎖與條件變量
信號量
簡介
信號量可以看作是互斥鎖和條件變量的結合,而互斥鎖和條件變量則可以看作是信號量的一種特殊形式。
信號量:只要信號量的value大于0,其他線程就可以sem_wait成功,成功后信號量的value減一。若value值不大于0,則sem_wait阻塞,直到sem_post釋放后value值加1。
以下是信號燈(量)的一些概念:
信號燈(量)API
創建和注銷
POSIX信號燈標準定義了有名信號燈和無名信號燈兩種,但LinuxThreads的實現僅有無名燈,同時有名燈除了總是可用于多進程之間以外,在使用上與無名燈并沒有很大的區別,因此下面僅就無名燈進行討論。
創建
int sem_init(sem_t *sem, int pshared, unsigned int value)
這是創建信號燈的API,其中value為信號燈的初值,pshared表示是否為多進程共享而不僅僅是用于一個進程。LinuxThreads沒有實現多進程共享信號燈,因此所有非0值的pshared輸入都將使sem_init()返回-1,且置errno為ENOSYS。初始化好的信號燈由sem變量表征,用于以下點燈、滅燈操作。
int sem_destroy(sem_t * sem)
被注銷的信號燈sem要求已沒有線程在等待該信號燈,否則返回-1,且置errno為EBUSY。除此之外,LinuxThreads的信號燈注銷函數不做其他動作。
點燈和滅燈
點燈
int sem_post(sem_t * sem)
點燈操作將信號燈值原子地加1,表示增加一個可訪問的資源,sem_post()是唯一能用于異步信號處理函數的POSIX異步信號安全的API。
滅燈
int sem_wait(sem_t * sem)
int sem_trywait(sem_t * sem)
sem_wait()為等待燈亮操作,等待燈亮(信號燈值大于0),然后將信號燈原子地減1,并返回。sem_trywait()為sem_wait()的非阻塞版,如果信號燈計數大于0,則原子地減1并返回0,否則立即返回-1,errno置為EAGAIN。
獲取燈值
int sem_getvalue(sem_t * sem, int * sval)
讀取sem中的燈計數,存于*sval中,并返回0。
辨析拾遺
Ref:
http://blog.chinaunix.net/uid-20671208-id-4935154.html
http://blog.chinaunix.net/uid-23061624-id-79936.html
總結
以上是生活随笔為你收集整理的互斥锁、条件变量、信号量浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下岗人员创业贷款条件
- 下一篇: 美国二季度手机出货量 70%手机为中