gpt4 book ai didi

ios - NSMainQueueConcurrencyType 和 NSPrivateQueueConcurrencyType 上下文的并发?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:21:56 24 4
gpt4 key购买 nike

使用 NSMainQueueConcurrencyType 和 NSPrivateQueueConcurrencyType 初始化的托管对象上下文连接到主队列和私有(private)队列,它们是串行队列,其中操作按 FIFO 顺序执行。

使用以下示例代码:

NSLog(@"Current thread : %@", [NSThread currentThread]);

[mainMoc performBlock:^{
NSLog(@"main 1 - %@", [NSThread currentThread]);

}];

[mainMoc performBlockAndWait:^{
NSLog(@"main 2 - %@", [NSThread currentThread]);

}];

[mainMoc performBlock:^{
NSLog(@"main 3 - %@", [NSThread currentThread]);

}];

[bgMoc performBlock:^{
NSLog(@"bg 1 - %@", [NSThread currentThread]);

}];

[bgMoc performBlockAndWait:^{
NSLog(@"bg 2 - %@", [NSThread currentThread]);

}];

[bgMoc performBlock:^{
NSLog(@"bg 3 - %@", [NSThread currentThread]);

}];

我期待它打印

main 1main 2main 3bg 1bg 2bg 3 按顺序排列,但打印出来的是:

Current thread : <NSThread: 0x60000006fb80>{number = 1, name = main}
main 2 - <NSThread: 0x60000006fb80>{number = 1, name = main}
bg 1 - <NSThread: 0x600000268900>{number = 3, name = (null)}
bg 2 - <NSThread: 0x60000006fb80>{number = 1, name = main}
bg 3 - <NSThread: 0x600000268900>{number = 3, name = (null)}
main 1 - <NSThread: 0x60000006fb80>{number = 1, name = main}
main 3 - <NSThread: 0x60000006fb80>{number = 1, name = main}

鉴于主队列和专用队列都是串行的,它背后的理论可能是什么?

最佳答案

并发是不确定的。您唯一可以保证的是“main1”在“main3”之前执行,因为正如您所说,它是一个 FIFO 队列。

区分performBlockperformBlockAndWait 很重要。

performBlock 是异步的,所以它只是将 block 放入队列并立即返回。这些 block 将按顺序执行。这就是为什么“main1”总是在“main3”之前执行的原因。

performBlockAndWait 是同步的,因此无法按定义处理队列。这意味着它将立即执行该 block 并且在完成之前不会返回。如果它不这样做,它就会阻塞,因为队列不为空,否则它必须首先执行队列中的所有其他任务。

现在“bg1”排在“bg2”之前的原因是调度。我几乎可以肯定,如果多次执行此测试,它最终可能会有所不同。如果主线程可以更快地到达同步“bg2”,它将首先出现。

关于ios - NSMainQueueConcurrencyType 和 NSPrivateQueueConcurrencyType 上下文的并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47588925/

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