Linux 信号量及其操作函数
信號量的本質(zhì)就是一個計數(shù)器,描述臨界資源的數(shù)目大小。(最多能有多少資源分配給線程)
目錄
一、什么是信號量?
二、信號量申請和釋放的過程(PV操作)
三、信號量操作函數(shù)
1、信號初始化 sem_init
2、申請信號量 sem_wait
3、釋放信號量 sem_post
4、銷毀信號量 sem_destroy
一、什么是信號量?
電影院預(yù)售1000張票,一旦預(yù)定成功,就會有你的位置,其他人無法占用;每有一個人退票或者看完電影,這張票就返還給電影院。
現(xiàn)在這1000張票就是一個臨界資源 tickets,我們把這個臨界資源劃分成為一個個小資源,分配給線程,這樣可以允許多個線程同時訪問臨界資源,從而實現(xiàn)并發(fā)。
信號量是一個計數(shù)器,這個計數(shù)器被合理使用,能夠達到對臨界資源預(yù)定的目的。每個線程要想訪問臨界資源,都得申請信號量!
?
二、信號量申請和釋放的過程(PV操作)
其實信號量的申請和釋放過程,和之前說線程資源沖突的場景有點類似。假設(shè)tickets = 1000,最基本的理解如下:
申請信號量 ==》 tickets --
釋放信號量 ==》 tickets ++
但是由于 ticket-- 或者 tickets ++這個操作不是原子的,會被其他線程“亂入”,所以我們要對其進行加鎖,等到自增或者自減結(jié)束以后,我們再解鎖。這就是典型的PV操作
tickets =?0,此時說明票已經(jīng)全部售出了,如果還有線程要來申請,那就只能讓這些線程暫時掛起,等其他線程釋放信號量以后,再給喚醒掛起的線程。
三、信號量操作函數(shù)
Linux專門為信號量提供一種數(shù)據(jù)結(jié)構(gòu),和之前學(xué)的信號集一樣
sem_t sem; //創(chuàng)建一個信號量1、信號初始化 sem_init
創(chuàng)建好的信號量只是一個空殼,初始值是多少,即要出售多少張票,我們并不知道,因此需要對信號量進行初始化。下面就依次介紹sem_init的各個參數(shù)。
第一個參數(shù),信號量的地址,即要初始化哪個信號量。
第二個參數(shù),選擇 線程間共享這個信號量 or 進程間共享這個信號量。如果 pshared = 0,線程間共享;pshared = 1,進程間共享。
第三個參數(shù),設(shè)置信號量的初始值。
返回值:成功返回0,失敗返回-1
2、申請信號量 sem_wait
你可以將上述信號量申請過程當(dāng)作這個函數(shù)的底層實現(xiàn)。參數(shù)是 要申請的信號量的地址。成功返回0,失敗返回-1。
3、釋放信號量 sem_post
這里的釋放信號量和下面的銷毀不一樣,這里的釋放只是把申請到的信號量歸還給臨界資源,而銷毀是將信號量這個計數(shù)器給銷毀。此時計數(shù)器的值 +1。參數(shù)是 要釋放的信號量的地址。成功返回0,失敗返回-1。
4、銷毀信號量 sem_destroy
調(diào)用以后,信號量這個計數(shù)器會被銷毀。參數(shù)是 要銷毀的信號量的地址。成功返回0,失敗返回-1。
總結(jié)
以上是生活随笔為你收集整理的Linux 信号量及其操作函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开源组件分析工具OpenSCA教程
- 下一篇: Linux多线程基础总结