-
1. 多線程的并發(fā)控制
-
1.1 在CGD中快速實(shí)現(xiàn)多線程的并發(fā)控制
NSOperationQueue來處理并發(fā)控制,但如何在GCD中快速的控制并發(fā)呢哥遮?答案就是dispatch_semaphore续镇,對經(jīng)常做unix開發(fā)的人來講美澳,我所介紹的內(nèi)容可能就顯得非常入門級了,信號量在他們的多線程開發(fā)中再平常不過了摸航。在GCD中有三個函數(shù)是semaphore的操作制跟,分別是:
- dispatch_semaphore_create 創(chuàng)建一個semaphore
- dispatch_semaphore_signal 發(fā)送一個信號
- dispatch_semaphore_wait 等待信號
簡單的介紹一下這三個函數(shù),第一個函數(shù)有一個整形的參數(shù)酱虎,我們可以理解為信號的總量雨膨,dispatch_semaphore_signal是發(fā)送一個信號,自然會讓信號總量加1读串,dispatch_semaphore_wait等待信號聊记,當(dāng)信號總量少于0的時(shí)候就會一直等待撒妈,否則就可以正常的執(zhí)行,并讓信號總量-1排监,根據(jù)這樣的原理狰右,我們便可以快速的創(chuàng)建一個并發(fā)控制。
<code>
dispatch_group_t group = 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 (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);
dispatch_release(group);
dispatch_release(semaphore);
</code>
簡單的介紹一下這一段代碼舆床,創(chuàng)建了一個初使值為10的semaphore棋蚌,每一次for循環(huán)都會創(chuàng)建一個新的線程,線程結(jié)束的時(shí)候會發(fā)送一個信號挨队,線程創(chuàng)建之前會信號等待谷暮,所以當(dāng)同時(shí)創(chuàng)建了10個線程之后,for循環(huán)就會阻塞瞒瘸,等待有線程結(jié)束之后會增加一個信號才繼續(xù)執(zhí)行坷备,如此就形成了對并發(fā)的控制,如上就是一個并發(fā)數(shù)為10的一個線程隊(duì)列情臭。
原文介紹:http://www.tanhao.me/pieces/392.html
-
1.2 在NSOperationQueue中快速實(shí)現(xiàn)多線程的并發(fā)控制
設(shè)置NSOperationQueue的maxConcurrentOperationCount來控制并發(fā)數(shù)量
<code>
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 10;
//放置任務(wù)
for (int i = 0; i < 100; i++) {
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"執(zhí)行并發(fā)隊(duì)列1:%d",i);
sleep(1);
}];
[queue addOperation:operation1];
}
</code>
-
2. 多線程的任務(wù)依賴控制
-
2.1通過dispatch_semaphore信號來控制任務(wù)的運(yùn)行順序
<code>
//通過dispatch_semaphore信號來控制任務(wù)的運(yùn)行順序
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_queue_create("testBlock", NULL);
dispatch_async(queue, ^{
for (int i = 0 ; i < 1000; i++) {
NSLog(@"i的值是:%d",i);
}
dispatch_semaphore_signal(sem);
});
//運(yùn)行到這兒時(shí),任務(wù)執(zhí)行發(fā)現(xiàn)信號需要等待赌蔑,此時(shí)線程阻塞俯在,等待信號發(fā)送完成信號。
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
for (int j = 0; j < 10; j ++)
{
NSLog(@"j的值是:%d",j);
}
</code>
-
2.2 通過NSOperation的addDependency來設(shè)置任務(wù)的依賴關(guān)系
<code>
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 10;
//任務(wù)1
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 100; i++) {
NSLog(@"執(zhí)行并發(fā)隊(duì)列1:%d",i);
}
}];
//任務(wù)2
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){
for (int i = 0; i < 15; i++) {
NSLog(@"執(zhí)行并發(fā)隊(duì)列2:%d",i);
}
}];
//添加依賴娃惯,operation1要依賴operation2才能繼續(xù)執(zhí)行
[operation1 addDependency:operation2];
[queue addOperation:operation1];
[queue addOperation:operation2];
</code>