GCD 串行线程执行流程

GCD Serial thread execution flow

在下面的示例函数中

    -(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 谁知道怎么写

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

但是,因为您的 serialQueue 正在 background 线程上执行块(尝试记录当前线程)——您的 1 和 3 操作与您的 2 同时发生和 4 个操作。

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

如果您将 dispatch_async 更改为分派到主队列,那么您确实会得到您想要的顺序 (2, 4, 1, 3) – 因为您安排的块将不得不等待主队列完成当前任务的执行(你的 2 和 4 操作 + 主队列正在做的任何其他事情)。