美文网首页其他
dispatch_set_target_queue让多个串行队列

dispatch_set_target_queue让多个串行队列

作者: 哦呵呵y | 来源:发表于2019-05-22 18:49 被阅读0次

在好多网络上的文章里面都有提到将多个串行队列使用dispatch_set_target_queue设置一个串行队列Target来保持同步执行

    dispatch_queue_t q1 = dispatch_queue_create("1", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t q2 = dispatch_queue_create("2", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t q3 = dispatch_queue_create("3", DISPATCH_QUEUE_SERIAL);
    dispatch_set_target_queue(q1, q3);
    dispatch_set_target_queue(q2, q3);
    dispatch_async(q1, ^{
        sleep(1);
        NSLog(@"1");
    });
    dispatch_async(q2, ^{
        sleep(1);
        NSLog(@"2");
    });

通过上面代码可以发现,两个串行队列q1,q2本来会同时执行,但是添加了target之后,保持了顺序执行。
但是其实这样做会导致其他问题。
情况1:

    dispatch_queue_t q1 = dispatch_queue_create("1", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t q2 = dispatch_queue_create("2", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t q3 = dispatch_queue_create("3", DISPATCH_QUEUE_SERIAL);
    dispatch_set_target_queue(q1, q3);
    dispatch_set_target_queue(q2, q3);
    for (int i = 0; i < 2; i ++) {
        dispatch_async(q1, ^{
            NSLog(@"123---%@", [NSThread currentThread]);
        });
        dispatch_async(q2, ^{
            NSLog(@"abc---%@", [NSThread currentThread]);
        });
    }

123---<NSThread: 0x600002e56840>{number = 3, name = (null)}
123---<NSThread: 0x600002e56840>{number = 3, name = (null)}
abc---<NSThread: 0x600002e56840>{number = 3, name = (null)}
abc---<NSThread: 0x600002e56840>{number = 3, name = (null)}

正常情况来说,上面两个任务应该交替执行才对。但是打印结果却是q1任务全部执行完才会执行q2.
所以通过dispatch_set_target_queue这个方法并不能解决让多个串行队列同步执行的问题。
情况2:

    dispatch_queue_t q1 = dispatch_queue_create("1", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t q2 = dispatch_queue_create("2", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t q3 = dispatch_queue_create("3", DISPATCH_QUEUE_SERIAL);
    dispatch_set_target_queue(q1, q3);
    dispatch_set_target_queue(q2, q3);
    for (int i = 0; i < 10; i ++) {
        dispatch_async(q1, ^{
            NSLog(@"123---%@", [NSThread currentThread]);
        });
        dispatch_async(q3, ^{
            NSLog(@"sss---%@", [NSThread currentThread]);
        });
        dispatch_async(q2, ^{
            NSLog(@"abc---%@", [NSThread currentThread]);
        });
    }

123---<NSThread: 0x60000029d600>{number = 3, name = (null)}
123---<NSThread: 0x60000029d600>{number = 3, name = (null)}
sss---<NSThread: 0x60000029d600>{number = 3, name = (null)}
abc---<NSThread: 0x60000029d600>{number = 3, name = (null)}
abc---<NSThread: 0x60000029d600>{number = 3, name = (null)}
sss---<NSThread: 0x60000029d600>{number = 3, name = (null)}

根据以上两种情况猜测dispatch_set_target_queue的执行逻辑:

image.png
如果所示,当提交任务到q1时,会将整个q1队列作为q3的任务,同理q2提交任务也一样,而q3是串行队列,所以会将q1队列中所有任务执行完才会执行后续任务。
也就是说当q1任务正在执行时,一直提交任务到q1,那么其他队列的任务都不会执行。

相关文章

  • dispatch_set_target_queue让多个串行队列

    在好多网络上的文章里面都有提到将多个串行队列使用dispatch_set_target_queue设置一个串行队列...

  • iOS开发中GCD普遍使用

    1.全局队列和主队 2.串行队列和并行队列 串行队列 并行队列 3.多个线程子任务完成后再执行某一个任务,GCD线...

  • dispatch_apply循环遍历

    dispatch_apply可以 在多个线程中同时(异步)遍历多个数字。无论是在串行队列,还是异步队列中,disp...

  • iOS GCD (一)

    概述 略 串行队列和并行队列 串行队列 - Serial Dispatch Queue 一个串行队列只存在一个线程...

  • GCD

    1、同步串行队列 2、同步并行队列 3、异步串行队列 4、异步并行队列 5、死锁 主线程中创建同步串行队列 主线程...

  • 关于多线程GCD 串行/并行、同步/异步

    一、GCD串行/并行队列创建 串行队列: 并行队列: 二、GCD串行/并行队列同步/异步执行 执行内容1: 执行结...

  • GCD四大队列

    一.队列 原则:队列先进先出原则 1.串行队列 串行队列:放到该队列上的任务,在子线程中串行执行 dispatch...

  • iOS 的串行队列和并发队列中的任务是如何执行的

    我们都知道队列有串行队列和并发队列,主队列就属于串行队列,串行队列里面的任务是按顺序执行,并发队列里的任务是并发执...

  • GCD队列使用

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

  • 多线程GCD笔记

    同步函数 + 主队列 异步函数 + 主队列 同步函数 + 串行队列 异步函数 + 串行队列 同步函数 + 并发队列...

网友评论

    本文标题:dispatch_set_target_queue让多个串行队列

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