美文网首页
iOS多线程随笔

iOS多线程随笔

作者: 周末年安 | 来源:发表于2015-03-11 15:59 被阅读253次
    • 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,根据这样的原理,我们便可以快速的创建一个并发控制。

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

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

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

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

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

    <code>
    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];
    }
    </code>

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

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

    <code>
    //通过dispatch_semaphore信号来控制任务的运行顺序
    __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);
    });
    //运行到这儿时,任务执行发现信号需要等待,此时线程阻塞,等待信号发送完成信号。
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    for (int j = 0; j < 10; j ++)
    {
    NSLog(@"j的值是:%d",j);
    }
    </code>

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

    <code>
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    queue.maxConcurrentOperationCount = 10;
    //任务1
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
    for (int i = 0; i < 100; i++) {
    NSLog(@"执行并发队列1:%d",i);
    }
    }];
    //任务2
    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];
    </code>

    相关文章

      网友评论

          本文标题:iOS多线程随笔

          本文链接:https://www.haomeiwen.com/subject/atqbxttx.html