GCD串口线程执行流程

时间:2016-05-07 10:21:10

标签: ios multithreading grand-central-dispatch

在以下示例函数中

    -(void)testThred{
    dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL);

    dispatch_async(serialQueue, ^{
        NSLog(@"1");
    });
     NSLog(@"2");

    dispatch_async(serialQueue, ^{
        NSLog(@"3");
    });
NSLog(@"4");

}

输出如下2,1,4,3

根据我的知识,它将是2,4,1,3,任何人都知道如何

1 个答案:

答案 0 :(得分:2)

这里保证的唯一顺序是4将在2之后发生,3将在1之后发生。这是因为你的自定义队列和主队列都是串行的 - 因此块按照它们的顺序执行安排好了。

但是,因为您的serialQueue正在后台线程上执行块(尝试记录当前线程) - 您的1和3操作将与您的2和4操作同时发生。< / p>

因此,串行队列上的操作与主队列上的操作之间的确切顺序是未定义的。

如果您将dispatch_async更改为调度到主队列,那么您确实会获得所需的订单(2,4,1,3) - 因为您安排的块必须等待主队列完成执行当前任务(你的2和4操作+主队列正在做的其他事情)。