信號(hào)量是一個(gè)整形值并且具有一個(gè)初始計(jì)數(shù)值贮配,并且支持兩個(gè)操作:信號(hào)通知和等待尿背。當(dāng)一個(gè)信號(hào)量被信號(hào)通知麦射,其計(jì)數(shù)會(huì)被增加钧排。當(dāng)一個(gè)線程在一個(gè)信號(hào)量上等待時(shí)制轰,線程會(huì)被阻塞(如果有必要的話)前计,直至計(jì)數(shù)器大于零,然后線程會(huì)減少這個(gè)計(jì)數(shù)垃杖。
在GCD中有三個(gè)函數(shù)是semaphore的操作男杈,分別是:
dispatch_semaphore_create 創(chuàng)建一個(gè)semaphore
dispatch_semaphore_signal 發(fā)送一個(gè)信號(hào)
dispatch_semaphore_wait 等待信號(hào)
簡(jiǎn)單的介紹一下這三個(gè)函數(shù),第一個(gè)函數(shù)有一個(gè)整形的參數(shù)缩滨,我們可以理解為信號(hào)的總量势就,dispatch_semaphore_signal是發(fā)送一個(gè)信號(hào),自然會(huì)讓信號(hào)總量加1脉漏,dispatch_semaphore_wait等待信號(hào)苞冯,當(dāng)信號(hào)總量少于0的時(shí)候就會(huì)一直等待,否則就可以正常的執(zhí)行侧巨,并讓信號(hào)總量-1舅锄。
根據(jù)這樣的原理,我們可以快速的創(chuàng)建一個(gè)并發(fā)控制來同步任務(wù)和有限資源訪問控制司忱。
dispatch_group_tgroup= dispatch_group_create();? ? ? dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);? ? ? dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);for(inti =0; i <100; i++)? ? ? {? ? ? ? ? dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);? ? ? ? ? dispatch_group_async(group, queue, ^{? ? ? ? ? ? ? NSLog(@"%i",i);? ? ? ? ? ? ? sleep(2);? ? ? ? ? ? ? dispatch_semaphore_signal(semaphore);? ? ? ? ? });? ? ? }? ? ? dispatch_group_wait(group, DISPATCH_TIME_FOREVER);? ? ? dispatch_release(group);? ? ? dispatch_release(semaphore);
簡(jiǎn)單的介紹一下這一段代碼皇忿,創(chuàng)建了一個(gè)初使值為10的semaphore,每一次for循環(huán)都會(huì)創(chuàng)建一個(gè)新的線程坦仍,線程結(jié)束的時(shí)候會(huì)發(fā)送一個(gè)信號(hào)鳍烁,線程創(chuàng)建之前會(huì)信號(hào)等待,所以當(dāng)同時(shí)創(chuàng)建了10個(gè)線程之后繁扎,for循環(huán)就會(huì)阻塞幔荒,等待有線程結(jié)束之后會(huì)增加一個(gè)信號(hào)才繼續(xù)執(zhí)行糊闽,如此就形成了對(duì)并發(fā)的控制,如上就是一個(gè)并發(fā)數(shù)為10的一個(gè)線程隊(duì)列爹梁。