dispatch_semaphore_signal
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ā)控制辽剧。
dispatch_group_t group = dispatch_group_create();
dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);//收到10個(gè)就觸發(fā)執(zhí)行
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (int i = 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);
簡(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ì)列谒出。
關(guān)于信號(hào)量,一般可以用停車來比喻邻奠。
停車場(chǎng)剩余4個(gè)車位笤喳,那么即使同時(shí)來了四輛車也能停的下。如果此時(shí)來了五輛車碌宴,那么就有一輛需要等待杀狡。
信號(hào)量的值就相當(dāng)于剩余車位的數(shù)目,dispatch_semaphore_wait函數(shù)就相當(dāng)于來了一輛車贰镣,dispatch_semaphore_signal
就相當(dāng)于走了一輛車呜象。停車位的剩余數(shù)目在初始化的時(shí)候就已經(jīng)指明了(dispatch_semaphore_create(long value)),
調(diào)用一次dispatch_semaphore_signal碑隆,剩余的車位就增加一個(gè)董朝;調(diào)用一次dispatch_semaphore_wait剩余車位就減少一個(gè);
當(dāng)剩余車位為0時(shí)干跛,再來車(即調(diào)用dispatch_semaphore_wait)就只能等待。有可能同時(shí)有幾輛車等待一個(gè)停車位祟绊。有些車主
沒有耐心楼入,給自己設(shè)定了一段等待時(shí)間哥捕,這段時(shí)間內(nèi)等不到停車位就走了,如果等到了就開進(jìn)去停車嘉熊。而有些車主就像把車停在這遥赚,
所以就一直等下去。
http://www.cnblogs.com/snailHL/p/3906112.html