日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 信号量及其操作函数

發布時間:2023/12/31 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 信号量及其操作函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。