在以下示例函数中
-(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,任何人都知道如何
答案 0 :(得分:2)
这里保证的唯一顺序是4将在2之后发生,3将在1之后发生。这是因为你的自定义队列和主队列都是串行的 - 因此块按照它们的顺序执行安排好了。
但是,因为您的serialQueue
正在后台线程上执行块(尝试记录当前线程) - 您的1和3操作将与您的2和4操作同时发生。< / p>
因此,串行队列上的操作与主队列上的操作之间的确切顺序是未定义的。
如果您将dispatch_async
更改为调度到主队列,那么您确实会获得所需的订单(2,4,1,3) - 因为您安排的块必须等待主队列完成执行当前任务(你的2和4操作+主队列正在做的其他事情)。