-
1. 多線程的并發(fā)控制
-
1.1 在CGD中快速實(shí)現(xiàn)多線程的并發(fā)控制
NSOperationQueue來處理并發(fā)控制,但如何在GCD中快速的控制并發(fā)呢?答案就是dispatch_semaphore,對(duì)經(jīng)常做unix開發(fā)的人來講,我所介紹的內(nèi)容可能就顯得非常入門級(jí)了,信號(hào)量在他們的多線程開發(fā)中再平常不過了。在GCD中有三個(gè)函數(shù)是semaphore的操作,分別是:
- dispatch_semaphore_create 創(chuàng)建一個(gè)semaphore
- dispatch_semaphore_signal 發(fā)送一個(gè)信號(hào)
- dispatch_semaphore_wait 等待信號(hào)
簡單的介紹一下這三個(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ā)控制。
<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)建了一個(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ì)列。
原文介紹: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信號(hào)來控制任務(wù)的運(yùn)行順序
<code>
//通過dispatch_semaphore信號(hào)來控制任務(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)信號(hào)需要等待,此時(shí)線程阻塞,等待信號(hào)發(fā)送完成信號(hào)。
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>