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