信號量與互斥鎖

信號量與普通整型變量的區(qū)別:

①信號量(semaphore)是非負整型變量奸绷,除了初始化之外,它只能通過兩個標準原子操作:wait(semap) , signal(semap) ; 來進行訪問羞迷;

②操作也被成為PV原語(P來源于Dutch proberen"測試",V來源于Dutch verhogen"增加")画饥,而普通整型變量則可以在任何語句塊中被訪問衔瓮;

信號量與互斥鎖之間的區(qū)別:

1. 互斥量用于線程的互斥,信號線用于線程的同步抖甘。

這是互斥量和信號量的根本區(qū)別热鞍,也就是互斥和同步之間的區(qū)別。

互斥:是指某一資源同時只允許一個訪問者對其進行訪問衔彻,具有唯一性和排它性薇宠。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的艰额。

同步:是指在互斥的基礎上(大多數(shù)情況)澄港,通過其它機制實現(xiàn)訪問者對資源的有序訪問。在大多數(shù)情況下柄沮,同步已經(jīng)實現(xiàn)了互斥回梧,特別是所有寫入資源的情況必定是互斥的废岂。少數(shù)情況是指可以允許多個訪問者同時訪問資源

2. 互斥量值只能為0/1,信號量值可以為非負整數(shù)狱意。

也就是說湖苞,一個互斥量只能用于一個資源的互斥訪問,它不能實現(xiàn)多個資源的多線程互斥問題髓涯。信號量可以實現(xiàn)多個同類資源的多線程互斥和同步袒啼。當信號量為單值信號量是,也可以完成一個資源的互斥訪問纬纪。

3. 互斥量的加鎖和解鎖必須由同一線程分別對應使用蚓再,信號量可以由一個線程釋放,另一個線程得到包各。

信號量

信號量(Semaphore)摘仅,有時被稱為信號燈,是在多線程環(huán)境下使用的一種設施, 它負責協(xié)調(diào)各個線程, 以保證它們能夠正確问畅、合理的使用公共資源娃属。

信號量可以分為幾類:

2 二進制信號量(binary semaphore):只允許信號量取0或1值,其同時只能被一個線程獲取护姆。

2 整型信號量(integer semaphore):信號量取值是整數(shù)矾端,它可以被多個線程同時獲得,直到信號量的值變?yōu)?卵皂。

2 記錄型信號量(record semaphore):每個信號量s除一個整數(shù)值value(計數(shù))外秩铆,還有一個等待隊列List,其中是阻塞在該信號量的各個線程的標識灯变。當信號量被釋放一個殴玛,值被加一后,系統(tǒng)自動從等待隊列中喚醒一個等待中的線程添祸,讓其獲得信號量滚粟,同時信號量再減一。

信號量通過一個計數(shù)器控制對共享資源的訪問刃泌,信號量的值是一個非負整數(shù)凡壤,所有通過它的線程都會將該整數(shù)減一。如果計數(shù)器大于0耙替,則訪問被允許亚侠,計數(shù)器減1;如果為0林艘,則訪問被禁止盖奈,所有試圖通過它的線程都將處于等待狀態(tài)。

計數(shù)器計算的結(jié)果是允許訪問共享資源的通行證狐援。因此钢坦,為了訪問共享資源究孕,線程必須從信號量得到通行證, 如果該信號量的計數(shù)大于0爹凹,則此線程獲得一個通行證厨诸,這將導致信號量的計數(shù)遞減,否則禾酱,此線程將阻塞直到獲得一個通行證為止微酬。當此線程不再需要訪問共享資源時,它釋放該通行證颤陶,這導致信號量的計數(shù)遞增颗管,如果另一個線程等待通行證,則那個線程將在那時獲得通行證滓走。

Semaphore可以被抽象為五個操作:

- 創(chuàng)建 Create

- 等待 Wait:

線程等待信號量垦江,如果值大于0,則獲得搅方,值減一比吭;如果只等于0,則一直線程進入睡眠狀態(tài)姨涡,知道信號量值大于0或者超時衩藤。

-釋放 Post

執(zhí)行釋放信號量,則值加一涛漂;如果此時有正在等待的線程赏表,則喚醒該線程。

-試圖等待 TryWait

如果調(diào)用TryWait怖喻,線程并不真正的去獲得信號量底哗,還是檢查信號量是否能夠被獲得岁诉,如果信號量值大于0锚沸,則TryWait返回成功;否則返回失敗涕癣。

-銷毀 Destroy

信號量哗蜈,是可以用來保護兩個或多個關鍵代碼段,這些關鍵代碼段不能并發(fā)調(diào)用坠韩。在進入一個關鍵代碼段之前距潘,線程必須獲取一個信號量。如果關鍵代碼段中沒有任何線程只搁,那么線程會立即進入該框圖中的那個部分音比。一旦該關鍵代碼段完成了,那么該線程必須釋放信號量氢惋。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量洞翩。為了完成這個過程稽犁,需要創(chuàng)建一個信號量,然后將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個關鍵代碼段的首末端骚亿。確認這些信號量VI引用的是初始創(chuàng)建的信號量已亥。 動作\系統(tǒng)

Win32

POSIX

創(chuàng)建

CreateSemaphore

sem_init

等待

WaitForSingleObject

sem _wait

釋放

ReleaseMutex

sem _post

試圖等待

WaitForSingleObject

sem _trywait

銷毀

CloseHandle

sem_destroy

互斥量(Mutex)

互斥量表現(xiàn)互斥現(xiàn)象的數(shù)據(jù)結(jié)構,也被當作二元信號燈来屠。一個互斥基本上是一個多任務敏感的二元信號虑椎,它能用作同步多任務的行為,它常用作保護從中斷來的臨界段代碼并且在共享同步使用的資源俱笛。

Mutex本質(zhì)上說就是一把鎖捆姜,提供對資源的獨占訪問,所以Mutex主要的作用是用于互斥迎膜。Mutex對象的值娇未,只有0和1兩個值。這兩個值也分別代表了Mutex的兩種狀態(tài)星虹。值為0, 表示鎖定狀態(tài)零抬,當前對象被鎖定,用戶進程/線程如果試圖Lock臨界資源宽涌,則進入排隊等待平夜;值為1,表示空閑狀態(tài)卸亮,當前對象為空閑忽妒,用戶進程/線程可以Lock臨界資源,之后Mutex值減1變?yōu)?兼贸。

Mutex可以被抽象為四個操作:

- 創(chuàng)建 Create

- 加鎖 Lock

- 解鎖 Unlock

- 銷毀 Destroy

Mutex被創(chuàng)建時可以有初始值段直,表示Mutex被創(chuàng)建后,是鎖定狀態(tài)還是空閑狀態(tài)溶诞。在同一個線程中鸯檬,為了防止死鎖,系統(tǒng)不允許連續(xù)兩次對Mutex加鎖(系統(tǒng)一般會在第二次調(diào)用立刻返回)螺垢。也就是說喧务,加鎖和解鎖這兩個對應的操作,需要在同一個線程中完成枉圃。

不同操作系統(tǒng)中提供的Mutex函數(shù): 動作\系統(tǒng)

Win32

Linyx

Solaris

創(chuàng)建

CreateMutex

pthread_mutex_init

mutex_init

加鎖

WaitForSingleObject

pthread_mutex_lock

mutex_lock

解鎖

ReleaseMutex

pthread_mutex_unlock

mutex_unlock

銷毀

CloseHandle

pthread_mutex_destroy

mutex_destroy

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末功茴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子孽亲,更是在濱河造成了極大的恐慌坎穿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玲昧,居然都是意外死亡犯祠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門酌呆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衡载,“玉大人,你說我怎么就攤上這事隙袁√涤椋” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵菩收,是天一觀的道長梨睁。 經(jīng)常有香客問我,道長娜饵,這世上最難降的妖魔是什么坡贺? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮箱舞,結(jié)果婚禮上遍坟,老公的妹妹穿的比我還像新娘。我一直安慰自己晴股,他們只是感情好愿伴,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著电湘,像睡著了一般隔节。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寂呛,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天怎诫,我揣著相機與錄音,去河邊找鬼贷痪。 笑死幻妓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的呢诬。 我是一名探鬼主播涌哲,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胖缤,長吁一口氣:“原來是場噩夢啊……” “哼尚镰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哪廓,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狗唉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涡真,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體分俯,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡肾筐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缸剪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吗铐。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杏节,靈堂內(nèi)的尸體忽然破棺而出唬渗,到底是詐尸還是另有隱情,我是刑警寧澤奋渔,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布镊逝,位于F島的核電站,受9級特大地震影響嫉鲸,放射性物質(zhì)發(fā)生泄漏撑蒜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一玄渗、第九天 我趴在偏房一處隱蔽的房頂上張望座菠。 院中可真熱鬧,春花似錦藤树、人聲如沸辈灼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巡莹。三九已至,卻和暖如春甜紫,著一層夾襖步出監(jiān)牢的瞬間降宅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工囚霸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腰根,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓拓型,卻偏偏與公主長得像额嘿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子劣挫,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 鎖是一種同步機制册养,用于多線程環(huán)境中對資源訪問的限制iOS中常見鎖的性能對比圖(摘自:ibireme): iOS鎖的...
    LiLS閱讀 1,518評論 0 6
  • 本文轉(zhuǎn)載自信號量與互斥鎖,如有侵權压固,請及時聯(lián)系博主刪除球拦。 1. 信號量與普通整型變量的區(qū)別: ①信號量(semap...
    GLGeek閱讀 1,241評論 0 1
  • 2016年國慶假期終于把此書過完坎炼,整理筆記和體會于此愧膀。 關于書名 書名源于俄羅斯的演員斯坦尼斯拉夫斯基創(chuàng)作的《演員...
    李劍飛的簡書閱讀 7,246評論 2 65
  • 1 臨界區(qū) 1.1簡介 在早期計算機系統(tǒng)中,只有一個任務進程在執(zhí)行谣光,并不存在資源的共享與競爭檩淋。隨著技術和需求的飛速...
    Fly晴天里Fly閱讀 9,036評論 2 13
  • 你好,親愛的Y先生: 遇見你之前萄金,我曾憧憬過一百次愛情的模樣狼钮。 遇見你之后,我卻愛上了只有一個樣子的你捡絮。 只可惜熬芜,...
    兔子cony閱讀 723評論 2 5