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 操作 + 主队列正在做的任何其他事情)。
在下面的示例函数中
-(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 操作 + 主队列正在做的任何其他事情)。