信號量釋放和等待函數sem_post()和sem_wait()

信號量:
信號量是IPC結構中的一種,是進程間通信的一種方法,也可以解決同一進程不同線程之間的通信問題。它是用來保證兩個或多個關鍵代碼段不被并發調用,防止多個進程同時對共享資源進行操作。

原理:
在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那么該線程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。

形象理解:
以一個停車場的運作為例。假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛直接進入,然后放下車攔,剩下的車則必須在入口等待,此后來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知后,打開車攔,放入外面的一輛進去,如果又離開兩輛,則又可以放入兩輛,如此往復。
在這個停車場系統中,車位是公共資源,每輛車好比一個線程,看門人起的就是信號量的作用。

兩種操作:
抽象的來講,信號量的特性如下:信號量是一個非負整數(車位數),所有通過它的線程/進程(車輛)都會將該整數減一(通過它當然是為了使用資源),當該整數值為零時,所有試圖通過它的線程都將處于等待狀態。
1. Wait(等待)
當一個線程調用Wait操作時,它要么得到資源然后將信號量減一,要么一直等下去(指放入阻塞隊列),直到信號量大于等于一時。
2. Release(釋放)
實際上是在信號量上執行加一操作,對應于車輛離開停車場,該操作之所以叫做“釋放”是因為釋放了由信號量守護的資源。

兩個函數:
sem_post函數(函數原型 int sem_post(sem_t *sem);)
作用是給信號量的值加上一個“1”。 當有線程阻塞在這個信號量上時,調用這個函數會使其中一個線程不在阻塞,選擇機制是有線程的調度策略決定的。
sem_wait函數(函數原型 int sem_wait(sem_t * sem);)
它的作用是從信號量的值減去一個“1”,但它永遠會先等待該信號量為一個非零值才開始做減法。

一種使用方法:
可以使用信號量完成類似于傳遞signal的功能:
某一個線程要在一定條件下完成特定功能,由其他多個線程提供條件。此時,其他線程調用sem_post()使信號量加一,本線程調用sem_wait()函數阻塞等待,信號量來了方可退出阻塞。
此種情況本線程只調用sem_wait(),之后不調用sem_post()。
?

原文地址:https://blog.csdn.net/megayangyang/article/details/55662170

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384461.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384461.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384461.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

信號量sem_init,sem_wait,sem_post

https://youth.blog.csdn.net/article/details/78318932?utm_mediumdistribute.pc_relevant.none-task-blog-OPENSEARCH-1.control&dist_request_id&depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-OPENSEARCH-1.control

QT的foreach用法

https://blog.csdn.net/qq_35488967/article/details/54602752 https://blog.csdn.net/xiaolong361/article/details/89417527

Linux信號之signal函數

1. 信號概述 何為信號:信號就是由用戶、系統或進程發送給目標進程的信息,以通知目標進程中某個狀態的改變或是異常。 信號產生:總體來說,其產生的條件有兩種,分別是:硬件和軟件原因,又稱為&…

Linux pause函數 詳解

int pause(void);   作用&#xff1a;使調用進程&#xff08;線程&#xff09;進入休眠狀態&#xff08;就是掛起&#xff09;&#xff1b;直到接收到信號且信號函數成功返回 pause函數才會返回   返回值&#xff1a;始終返回-1  示例代碼: #include <sys/types.h>…

Linux中wait()函數及waitpid()函數

編程過程中&#xff0c;有時需要讓一個進程等待另一個進程&#xff0c;最常見的是父進程等待自己的子進程&#xff0c;或者父進程回收自己的子進程資源包括僵尸進程。這里簡單介紹一下系統調用函數&#xff1a;wait() 函數原型是 #include <sys/types.h> #include <…

Linux下Kill函數用法

&#xff3b; KILL &#xff3d;功能描述&#xff1a; 用于向任何進程組或進程發送信號。 頭文件用法&#xff1a; 1 #include < sys / types.h > 2 3 #include < signal.h > 4 5 int kill(pid_t pid, int sig); 6 7 參數&#xff1a; pid&#xff1…

學習筆記 --- DM9000網卡原理與基地址設置

前面有文章分析了網卡也是屬于類內存總線的設備&#xff0c;類內存總線的設備有地址總線和數據總線&#xff0c;先來看下DM9000的管腳&#xff1a; 從上面可以看出DM9000的地址總線就一根&#xff0c;它不像CS8900那樣地址總線和數據總線都齊全。而這里只有一根地址線(CMD)&…

Micrium/UCOS官網賬號密碼重新改問題

https://blog.csdn.net/qq_42312125/article/details/104122502

靜態VLAN的配置

在一臺交換機上連接3臺PC機&#xff0c;然后創建兩個VLAN&#xff0c;分別為VLAN 10 和VLAN 20&#xff0c;把第一臺PC機分配給VLAN 10&#xff0c;把其他兩臺分配給VLAN 20.然后測試他們的互通情況。 在這里命令我用的都是簡化命令&#xff0c;想卡完整版命令&#xff0c;請到…

靜態路由原理

1、路由器的工作原理 路由工作簡單原理圖 1&#xff09;主機1.1要發生數據包給主機4.1.因為IP地址不在同一網段&#xff0c;所以主機會將數據包發送給本網段的網關路由器。 2&#xff09;路由器A 接收到數據包&#xff0c;先查看數據包IP首部中的目標IP地址。再查找自己的路由表…

靜態路由和默認路由

一、靜態路由的配置 下邊實驗對該拓撲圖進行配置 實驗目標&#xff1a;配置靜態路由&#xff0c;實現全網互通 1、配置路由器R1 進入接口f0/0&#xff0c;配置IP&#xff0c;并開啟。 進入接口f0/1&#xff0c;配置IP&#xff0c;并開啟。 設置靜態路由。 查看PC1的路由表 2、配…

IP地址192.168.1.1/24中的/24是什么意思

/24是指子網掩碼的位數。 子網掩碼的位數總共有32個&#xff0c;寫的的/24個就是24個1&#xff0c;其它8位都是0。 /24就可以寫成子網掩碼是&#xff1a;11111111 11111111 11111111 00000000 例如&#xff1a; /25&#xff0c;就代表有25個1&#xff0c;7個0&#xff0c;…

VLAN與子網劃分區別

轉自&#xff1a;http://bbs.51cto.com/thread-1514066-1.html 經常看到論壇里有新手上來發貼說已經弄了VLAN了&#xff0c;為什么還要劃分IP子網的問題。今天詳細講一下。 VLAN與IP子網&#xff08;劃分&#xff09;的區別。有點類似于重量和質量的區別: 重量的的單位是牛頓&…

IP地址中A類、B類、C類地址的區別

區別如下&#xff1a; 1、IP地址表示方法不同&#xff1a; 一個A類IP地址是指&#xff0c; 在IP地址的四段號碼中&#xff0c;第一段號碼為網絡號碼&#xff0c;剩下的三段號碼為本地計算機的號碼。如果用二進制表示IP地址的話&#xff0c;A類IP地址就由1字節的網絡地址和3字…

原始套接字簡介

一 原始套接字概述 原始套接字&#xff0c;指在傳輸層下面使用的套接字。流式套接字和數據報套接字這兩種套接字工作在傳輸層&#xff0c;主要為應用層的應用程序提供服務&#xff0c;并且在接收和發送時只能操作數據部分&#xff0c;而不能對IP首部或TCP和UDP首部進行操作&am…

原始socket例子

https://blog.csdn.net/qq_35426012/article/details/98858401 https://blog.51cto.com/u_13603157/2095503

Ucosii消息郵箱使用

https://blog.csdn.net/oyhb_1992/article/details/75270739 https://www.cnblogs.com/itloverhpu/p/3139511.html

ucosii中消息隊列、消息郵箱、信號量的區別

1、用信號量進行行為同步時&#xff0c;只能提供同步的時刻信息&#xff0c;不能提供內容信息。若被控制方要求得到控制方的內容信息時&#xff0c;可以使用消息郵箱或消息隊列。 2、但由于消息郵箱里只能存放一條消息&#xff0c;所以使用消息郵箱進行任務的同步時&#xff0c…

宏的使用 extern

https://www.cnblogs.com/chulin/p/9389254.html

#ifdef __cplusplus extern “C”的作用詳解

https://blog.csdn.net/dayou1024/article/details/107017432