信號(hào)量

信號(hào)量(Semaphore)柜思,有時(shí)被稱(chēng)為信號(hào)燈姑隅,是在多線程環(huán)境下使用的一種設(shè)施莱坎,是可以用來(lái)保證兩個(gè)或多個(gè)關(guān)鍵代碼段不被并發(fā)調(diào)用蛛蒙。在進(jìn)入一個(gè)關(guān)鍵代碼段之前糙箍,線程必須獲取一個(gè)信號(hào)量;一旦該關(guān)鍵代碼段完成了宇驾,那么該線程必須釋放信號(hào)量倍靡。其它想進(jìn)入該關(guān)鍵代碼段的線程必須等待直到第一個(gè)線程釋放信號(hào)量。為了完成這個(gè)過(guò)程课舍,需要?jiǎng)?chuàng)建一個(gè)信號(hào)量VI,然后將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個(gè)關(guān)鍵代碼段的首末端他挎。確認(rèn)這些信號(hào)量VI引用的是初始創(chuàng)建的信號(hào)

以一個(gè)停車(chē)場(chǎng)的運(yùn)作為例筝尾。簡(jiǎn)單起見(jiàn),假設(shè)停車(chē)場(chǎng)只有三個(gè)車(chē)位办桨,一開(kāi)始三個(gè)車(chē)位都是空的筹淫。這時(shí)如果同時(shí)來(lái)了五輛車(chē),看門(mén)人允許其中三輛直接進(jìn)入呢撞,然后放下車(chē)攔损姜,剩下的車(chē)則必須在入口等待饰剥,此后來(lái)的車(chē)也都不得不在入口處等待。這時(shí)摧阅,有一輛車(chē)離開(kāi)停車(chē)場(chǎng)汰蓉,看門(mén)人得知后,打開(kāi)車(chē)攔棒卷,放入外面的一輛進(jìn)去顾孽,如果又離開(kāi)兩輛,則又可以放入兩輛比规,如此往復(fù)若厚。
在這個(gè)停車(chē)場(chǎng)系統(tǒng)中,車(chē)位是公共資源蜒什,每輛車(chē)好比一個(gè)線程测秸,看門(mén)人起的就是信號(hào)量的作用。
抽象的來(lái)講灾常,信號(hào)量的特性如下:信號(hào)量是一個(gè)非負(fù)整數(shù)(車(chē)位數(shù))乞封,所有通過(guò)它的線程/進(jìn)程(車(chē)輛)都會(huì)將該整數(shù)減一(通過(guò)它當(dāng)然是為了使用資源),當(dāng)該整數(shù)值為零時(shí)岗憋,所有試圖通過(guò)它的線程都將處于等待狀態(tài)肃晚。在信號(hào)量上我們定義兩種操作: Wait(等待) 和 Release(釋放)。當(dāng)一個(gè)線程調(diào)用Wait操作時(shí)仔戈,它要么得到資源然后將信號(hào)量減一关串,要么一直等下去(指放入阻塞隊(duì)列),直到信號(hào)量大于等于一時(shí)监徘。Release(釋放)實(shí)際上是在信號(hào)量上執(zhí)行加操作晋修,對(duì)應(yīng)于車(chē)輛離開(kāi)停車(chē)場(chǎng),該操作之所以叫做“釋放”是因?yàn)獒尫帕擞尚盘?hào)量守護(hù)的資源凰盔。

以上是百度百科內(nèi)容方便理解信號(hào)量

對(duì)信號(hào)量有4種操作:

1. 初始化(initialize)墓卦,也叫做建立(create):

dispatch_semaphore_t dispatch_semaphore_create( long value);

2. 等信號(hào)(wait),也可叫做掛起(suspend):

線程等待信號(hào)量户敬,如果值大于0落剪,則獲得,值減一尿庐;如果值等于0忠怖,則線程進(jìn)入睡眠狀態(tài),只到信號(hào)量值大于0或者超時(shí)抄瑟。

long dispatch_semaphore_wait( dispatch_semaphore_t dsema,  dispatch_time_t timeout); 

如果返回的結(jié)果是0說(shuō)明線程線程被成功喚醒,非0說(shuō)明超時(shí);

3. 給信號(hào)(signal)或發(fā)信號(hào)(post):

執(zhí)行釋放信號(hào)量凡泣,則值加一;如果此時(shí)有正在等待的線程,則喚醒該線程鞋拟。

long dispatch_semaphore_signal( dispatch_semaphore_t dsema);

如果返回的是非零的數(shù)字則說(shuō)明有一個(gè)線程被喚醒,返回0則說(shuō)明沒(méi)有線程被喚醒(說(shuō)明沒(méi)有wait的線程)

4.清理(destroy):

 dispatch_release(object) //在ARC中不需要此步驟

示例代碼

   dispatch_group_t group = dispatch_group_create();
   dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
   dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
   for (int i = 0; i < 100; i++)
   {
       long l1 = dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
       NSLog(@"l1:%ld",l1);
       NSLog(@"semaphore:%@",semaphore.accessibilityValue);
       dispatch_group_async(group, queue, ^{
           NSLog(@"%i",i);
           sleep(2);
           long l2 = dispatch_semaphore_signal(semaphore);
           NSLog(@"l2:%ld",l2);
       });
   }
   dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骂维,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贺纲,更是在濱河造成了極大的恐慌航闺,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哮笆,死亡現(xiàn)場(chǎng)離奇詭異来颤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)稠肘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)福铅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人项阴,你說(shuō)我怎么就攤上這事滑黔。” “怎么了环揽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵略荡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我歉胶,道長(zhǎng)汛兜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任通今,我火速辦了婚禮粥谬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辫塌。我一直安慰自己漏策,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布臼氨。 她就那樣靜靜地躺著掺喻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪储矩。 梳的紋絲不亂的頭發(fā)上感耙,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音椰苟,去河邊找鬼抑月。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舆蝴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼洁仗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼层皱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起赠潦,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叫胖,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后她奥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瓮增,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年哩俭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绷跑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凡资,死狀恐怖砸捏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隙赁,我是刑警寧澤垦藏,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站伞访,受9級(jí)特大地震影響掂骏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厚掷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一弟灼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝗肪,春花似錦袜爪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至豁延,卻和暖如春昙篙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诱咏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工苔可, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袋狞。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓焚辅,卻偏偏與公主長(zhǎng)得像映屋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子同蜻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • 本文為轉(zhuǎn)載資料棚点,原文地址: http://www.reibang.com/p/02821f9d7777 一、信號(hào)量...
    一曰就是一天閱讀 1,130評(píng)論 0 3
  • GCD中類(lèi)似的API也可以實(shí)現(xiàn)大部分相同的操作: 一湾蔓、信號(hào)量的簡(jiǎn)單介紹: 1.信號(hào)量: 信號(hào)量(Semaphore...
    FrankHuang93閱讀 2,374評(píng)論 0 8
  • 本文轉(zhuǎn)載自信號(hào)量與互斥鎖瘫析,如有侵權(quán),請(qǐng)及時(shí)聯(lián)系博主刪除默责。 1. 信號(hào)量與普通整型變量的區(qū)別: ①信號(hào)量(semap...
    GLGeek閱讀 1,232評(píng)論 0 1
  • 信號(hào)量與普通整型變量的區(qū)別: ①信號(hào)量(semaphore)是非負(fù)整型變量贬循,除了初始化之外,它只能通過(guò)兩個(gè)標(biāo)準(zhǔn)原子...
    北風(fēng)知我意閱讀 1,864評(píng)論 0 3
  • 關(guān)于dispatch_semaphore的使用 轉(zhuǎn)載請(qǐng)注明出處http://www.cnblogs.com/sna...
    airpoet閱讀 707評(píng)論 2 0