美文网首页iOS 深度好文
iOS GCD之并发队列和串行队列

iOS GCD之并发队列和串行队列

作者: 红袖吾狗 | 来源:发表于2017-04-12 22:44 被阅读362次
dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(serialQueue, ^{
       // NSLog(@"1");
        sleep(3);
        NSLog(@"1");
    });
    dispatch_sync(serialQueue, ^{
        
        sleep(1);
        NSLog(@"2");
        
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"3");
    });
    dispatch_sync(serialQueue, ^{
        sleep(5);
        NSLog(@"4");
    });
    
    dispatch_async(serialQueue, ^{
        
        NSLog(@"5");
    });

看看上面的代码,你猜猜会输出什么东东? 反正在今天之前我会认为它输出坑定不是有序的,之前一直认为串行就是一个一个执行,好,第一个是异步,那就异步去吧,第二个同步,同步执行完,去执行第三个,然后..... 同步就执行完,然后执行下一个,异步就不知道什么时候执行完了。

哈哈哈哈,今天我不得不对自己的想法勘称sb。太自以为是了。从中就可以看出我不能理解串行队列的本质。

那么什么是串行队列?什么是并行队列?

  • Concurrent: tasks are dequeued in FIFO order, but run concurrently and can finish in any order.

  • Serial: tasks execute one at a time in FIFO order

并发: 任务以FIFO从序列中移除,然后并发运行,可以按照任何顺序完成。它会自动开启多个线程同时执行任务

串行: 任务以FIFO从序列中一个一个执行。一次只调度一个任务,队列中的任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)而且只会开启一条线程

为了再次证实串行队列中只有一个线程执行任务:

dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL);
 
    for (int i = 0; i< 10;i++){
        // 10个异步
        dispatch_async(queue, ^{
            NSLog(@"%@--%d",[NSThread currentThread], i);
        });
    }
s_1.png

我们可以发现thread的地址是一样的,那就证实了serial queue只有一个线程执行任务。然后我们测试一下并发队列

dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT);
     
    for (int i = 0; i< 10;i++){
        // 10个异步
        dispatch_async(queue, ^{
            NSLog(@"%@--%d",[NSThread currentThread], i);
        });
    }
s_2.png

由上图可以看出并发队列中是有多个线程执行任务的。

比较上面两个程序,我们仅仅是创建了两个不同类型的queue,但是结果迥然不同,并发会开启多个线程,执行的顺序我们无法控制,至于那个线程执行那个任务由队列决定,哪个任务先完成由CPU和操作系统决定,并且并发队列中的线程是可以重复利用(线程池),这也是可以理解的,但是下面:

dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT);
    
    for (int i = 0; i< 10;i++){
        // 10个异步
        dispatch_sync(queue, ^{
            NSLog(@"%@--%d",[NSThread currentThread], i);
        });
    }
s_3.png

发现并发只能在异步函数下有效,name=main ,还不会创建新线程。所有的任务依次在主线程上执行。

本文转载自:http://www.cnblogs.com/Ohero/p/4727000.html

相关文章

  • iOS开发多线程之GCD

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 GCD...

  • iOS开发之GCD并发队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 03 ...

  • iOS开发之GCD同步任务加强

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 004...

  • iOS开发之GCD串行队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 实例d...

  • 多线程

    iOS中的几种多线程GCD1、GCD分为任务和队列,任务(同步,异步)队列(串行,并发),同步串行,同步主队列的情...

  • GCD队列使用

    使用GCD前,先对队列总结一下: 串行和并发 GCD中队列分为两种:串行队列、并发队列。串行队列:任务按在队列里的...

  • 关于GCD总结

    什么是GCD 理解串行、并发及同步异步 串行和并发 同步和异步 队列 串行队列 两者等效.2)使用主队列(在主队列...

  • GCD串行并发队列

    学习完本篇,您会对以下知识点更加理解: 队列 串行队列 并发队列 GCD全局队列 GCD主队列 创建串行队列 创建...

  • 队列dispatch_queue的使用

    队列分为:串行队列、并发队列和主队列,主队列也叫特殊串行队列,是GCD自带的。 任务的执行分为:同步执行和异步执行...

  • 2021--- GCD

    gcd同步,异步,串行队列,并发队列,全局队列,主队列,以及死锁。 1、gcd队列阻塞问题[https://www...

网友评论

    本文标题:iOS GCD之并发队列和串行队列

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