亞寵展、全球?qū)櫸锂a(chǎn)業(yè)風(fēng)向標(biāo)——亞洲寵物展覽會深度解析
1133
2025-03-31
1. 信號量介紹
信號量的運(yùn)用環(huán)境與互斥鎖一樣,但是信號量比互斥鎖增加靈活,互斥鎖只有兩個狀態(tài)(開鎖和解鎖),而信號量本質(zhì)上是一個計數(shù)器,它內(nèi)部有一個變量計數(shù)信號值,可以保護(hù)一個資源可以同時被1個或者2個或者3個線程同時使用,如果信號量的值只是設(shè)置1(狀態(tài)只有0和1),那么和互斥鎖就是一樣的功能。
總結(jié)
信號量也主要是用來保護(hù)共享資源(信號量也屬于臨界資源),使得資源在一個時刻只有一個線程或者多個線程獨(dú)享。
信號量是一種特殊的變量,訪問具有原子性, 用于解決進(jìn)程或線程間共享資源引發(fā)的同步問題。
信號量就是一個計數(shù)變量,內(nèi)部本身就是一個變量。只不過這個變量具有原子性。
信號量經(jīng)常用來保護(hù)臨界區(qū)資源、實(shí)現(xiàn)資源同步。
如果信號量只有2個值,0和1,就稱為二值信號量==互斥鎖。
**信號量和互斥鎖(mutex)的區(qū)別:**互斥鎖只允許一個線程進(jìn)入臨界區(qū),而信號量允許多個線程同時進(jìn)入臨界區(qū),要使用信號量同步,需要包含頭文件semaphore.h。
2. 信號量實(shí)現(xiàn)接口函數(shù)
2.1 初始化信號量
#include
sem_init是創(chuàng)建信號量的 API,其中 value 為信號量的初值,pshared 表示是否為多進(jìn)程共享而不僅僅是用于一個進(jìn)程之間的多線程共享。
如果pshared的值為0,那么信號量在進(jìn)程的線程之間共享,并且應(yīng)位于所有線程可見的某個地址(例如,全局變量)能夠,或在堆上動態(tài)分配的變量),如果pshared不為零,那么信號量在進(jìn)程之間共享,信號量的值就位于共享內(nèi)存區(qū)域。
2.2 注銷信號量
int sem_destroy(sem_t * sem);
注銷信號量時,必須保證被注銷的信號量 sem沒有線程在等待該信號量,否則會返回-1,且置 errno 為 EBUSY。正常返回0。
2.3 釋放信號量
int sem_post(sem_t * sem); //相當(dāng)于解鎖
釋放信號量操作將信號量值原子地加 1,表示增加一個可訪問的資源。只有信號量值大于 0,才能訪問公共資源。主要用來增加信號量的值。當(dāng)有線程阻塞在這個信號量上時,調(diào)用這個函數(shù)會使其中的一個線程不在阻塞。
2.4 等待信號量
int sem_wait(sem_t * sem); //相當(dāng)于加鎖 int sem_trywait(sem_t * sem); //不阻塞
sem_wait()用于阻塞等待信號量(獲取信號量),主要被用來阻塞當(dāng)前線程直到信號量 sem 的值大于 0,得到信號量之后,信號量的值會減一。
2.5 獲取當(dāng)前的信號量值
int sem_getvalue(sem_t * sem, int * sval);
讀取sem中的信號量計數(shù),存于*sval 中,并返回 0。
3. 案例代碼: 信號量框架運(yùn)用模型
#include
linux 任務(wù)調(diào)度
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。