在下面的示例函数中
-(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 之后发生。这是因为您的自定义队列和主队列都是串行的 - 因此 block 将按照它们的顺序执行已安排。
但是,因为您的 serialQueue
正在后台线程上执行 block (尝试记录当前线程)——您的 1 和 3 操作与您的 2 和 4 同时发生操作。
因此,串行队列上的操作与主队列上的操作之间的确切顺序是不确定的。
如果您将 dispatch_async
更改为分派(dispatch)到主队列,那么您确实会得到您想要的顺序(2、4、1、3)——因为您调度的 block 必须等待主队列完成其当前任务的执行(您的 2 和 4 操作 + 主队列正在执行的任何其他操作)。
关于ios - GCD 串行线程执行流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37087296/