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

标签 ios objective-c multithreading queue grand-central-dispatch

我认为“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/

相关文章:

objective-c - 使用 Swift 4 在 Xcode 9 上找不到“ProjectName-Swift.h”文件?

ios - Obj-C 中的委托(delegate)方法签名,了解它们的 C# 等价物是什么

c++ - C++ 线程中未触及的共享资源

java - 使用线程时客户端/服务器 Swing 程序卡住

ios - 这是使用 heightForRowAt 的正确方法吗?

html - 密码输入字段在 ios safari 中不起作用

ios - 将 XML 文件从站点获取到电话

ios - 在 Swift 中将协议(protocol)类型作为参数传递

iphone - 我什么时候应该将我的代码包装到自动释放池中

java - 'synchronized'是什么意思?