iOS多线程笔记

1.多线程的并发控制



1.1在CGD中快速实现多线程的并发控制



NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是

dispatch_semaphore,对经常做unix开发的人来讲,我所介绍的内容可能就显得非常入门级了,信号量在他们的多线程开发中再平常不过了。

在GCD中有三个函数是semaphore的操作,分别是:

dispatch_semaphore_create          创建一个semaphore
dispatch_semaphore_signal          发送一个信号
dispatch_semaphore_wait              等待信号
简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制。

    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);


简单的介绍一下这一段代码,创建了一个初使值为10的semaphore,每一次for循环都会创建一个新的线程,线程结束的时候会发送一个信号,线程创建之前会信号等待,所以当同时创建了10个线程之后,for循环就会阻塞,等待有线程结束之后会增加一个信号才继续执行,如此就形成了对并发的控制,如上就是一个并发数为10的一个线程队列。


原文介绍:http://www.tanhao.me/pieces/392.html


1.2在NSOperationQueue中快速实现多线程的并发控制



设置NSOperationQueue的maxConcurrentOperationCount来控制并发数量

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    queue.maxConcurrentOperationCount = 10;
    
    for (int i = 0; i < 100; i++) {
        NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"执行并发队列1:%d",i);
            sleep(1);
        }];
        [queue addOperation:operation1];
    }


2.多线程的任务依赖控制

2.1通过dispatch_semaphore信号来控制任务的运行顺序

<p class="p1"><span class="s1">    </span><span class="s2">__block</span><span class="s1"> </span><span class="s3">dispatch_semaphore_t</span><span class="s1"> sem = </span><span class="s4">dispatch_semaphore_create</span><span class="s1">(</span><span class="s5">0</span><span class="s1">);</span></p><p class="p1"><span class="s1">    </span><span class="s3">dispatch_queue_t</span><span class="s1"> queue = </span><span class="s4">dispatch_queue_create</span><span class="s1">(</span><span class="s6">"testBlock"</span><span class="s1">, </span><span class="s2">NULL</span><span class="s1">);</span></p><p class="p2"><span class="s4">    </span><span class="s7">dispatch_async</span><span class="s4">(queue, ^{</span></p><p class="p2"><span class="s4">        </span><span class="s2">for</span><span class="s4"> (</span><span class="s2">int</span><span class="s4"> i = </span><span class="s5">0</span><span class="s4"> ; i < </span><span class="s5">1000</span><span class="s4">; i++) {</span></p><p class="p2"><span class="s4">            </span><span class="s7">NSLog</span><span class="s4">(</span><span class="s6">@"i</span><span class="s8">的值是</span><span class="s6">:%d"</span><span class="s4">,i);</span></p><p class="p2"><span class="s4">        }</span></p><p class="p1"><span class="s1">        </span><span class="s4">dispatch_semaphore_signal</span><span class="s1">(sem);</span></p><p class="p2"><span class="s4">    });</span></p><p class="p3"><span class="s4">    </span></p><p class="p4"><span class="s9">    </span><span class="s10">//</span><span class="s4">运行到这儿时,任务执行发现信号需要等待其它任务运行完成并发送信号。</span></p><p class="p1"><span class="s1">    </span><span class="s4">dispatch_semaphore_wait</span><span class="s1">(sem, </span><span class="s11">DISPATCH_TIME_FOREVER</span><span class="s1">);</span></p><p class="p2"><span class="s4">    </span><span class="s2">for</span><span class="s4"> (</span><span class="s2">int</span><span class="s4"> j = </span><span class="s5">0</span><span class="s4">; j < </span><span class="s5">10</span><span class="s4">; j ++)</span></p><p class="p2"><span class="s4">    {</span></p><p class="p2"><span class="s4">        </span><span class="s7">NSLog</span><span class="s4">(</span><span class="s6">@"j</span><span class="s8">的值是</span><span class="s6">:%d"</span><span class="s4">,j);</span></p><p class="p2"><span class="s4">    }</span></p>


2.2通过NSOperation的addDependency来设置任务的依赖关系

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    queue.maxConcurrentOperationCount = 10;
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 100; i++) {
            NSLog(@"执行并发队列1:%d",i);
        }
    }];
    
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){
        for (int i = 0; i < 15; i++) {
            NSLog(@"执行并发队列2:%d",i);
        }
    }];
    //添加依赖,operation1要依赖operation2才能继续执行
    [operation1 addDependency:operation2];   
    [queue addOperation:operation1];
    [queue addOperation:operation2];


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值