gpt4 book ai didi

ios - 为什么异步并行队列在最后运行

转载 作者:行者123 更新时间:2023-11-29 00:01:21 28 4
gpt4 key购买 nike

我认为“end”将在 for 循环中打印,但这是错误的,你能告诉我为什么吗?这是代码:

dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);

for (NSUInteger i = 0; i < 1000; i++) {
dispatch_async(queue, ^{
NSLog(@"i:%lu", (unsigned long)i);
});
}

dispatch_async(queue, ^{
NSLog(@"end:%@", [NSThread currentThread]);
});

结果:

2018-03-22 19:26:33.812371+0800 MyIOSNote[96704:912772] i:990
2018-03-22 19:26:33.812671+0800 MyIOSNote[96704:912801] i:991
2018-03-22 19:26:33.812935+0800 MyIOSNote[96704:912662] i:992
2018-03-22 19:26:33.813295+0800 MyIOSNote[96704:912802] i:993
2018-03-22 19:26:33.813552+0800 MyIOSNote[96704:912766] i:994
2018-03-22 19:26:33.813856+0800 MyIOSNote[96704:912778] i:995
2018-03-22 19:26:33.814299+0800 MyIOSNote[96704:912803] i:996
2018-03-22 19:26:33.814648+0800 MyIOSNote[96704:912779] i:997
2018-03-22 19:26:33.814930+0800 MyIOSNote[96704:912759] i:998
2018-03-22 19:26:33.815361+0800 MyIOSNote[96704:912804] i:999
2018-03-22 19:26:33.815799+0800 MyIOSNote[96704:912805] end:<NSThread: 0x60400027e200>{number = 3, name = (null)}

最佳答案

看执行顺序。您首先将 1000 个 block 排入队列以打印一个数字。然后将 block 排入队列以打印“结束”。所有这些 block 都被排队以在同一个并发后台队列上异步运行。对 dispatch_async 的所有 1001 次调用都是按顺序完成的,一次一个,在运行此代码的任何线程上,该线程来自不同的队列,所有排队的 block 都将在其上运行。

并发队列将按照入队顺序弹出每个 block 并运行它。由于它是一个并发队列,并且每个队列都是异步运行的,因此理论上,其中一些队列可能会有点乱序。但一般来说,输出将以相同的顺序出现,因为每个 block 都做完全相同的事情 - 一个简单的 NSLog 语句。

但简短的回答是“end”最后打印,因为它是最后排队的,在所有其他 block 都已排队之后。

可能有帮助的是记录每个排队的调用:

dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);

for (NSUInteger i = 0; i < 1000; i++) {
NSLog(@"enqueue i: %lu", (unsigned long)i);
dispatch_async(queue, ^{
NSLog(@"run i: %lu", (unsigned long)i);
});
}

NSLog(@"enqueue end");
dispatch_async(queue, ^{
NSLog(@"run end: %@", [NSThread currentThread]);
});

关于ios - 为什么异步并行队列在最后运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49427613/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com