gpt4 book ai didi

ios - dispatch_queue_t 是串行队列那么为什么它甚至存在于多任务概念中?

转载 作者:可可西里 更新时间:2023-11-01 17:17:29 28 4
gpt4 key购买 nike

我是 iPhone 开发的新手,正在经历多线程的 GCD 概念。

'dispatch_queue_t' 创建一个串行队列,我读到串行队列一次只能执行一个作业。 GCD 旨在同时执行多个任务,那么为什么串行队列还要存在?

例如,我想做2个任务。任务 A 和任务 B。我创建了一个串行队列来执行这两个任务。我在主队列中这样做。这是我正在做的代码:

dispatch_queue_t my_serial_queue = dispatch_queue_create("queue_identifier", 0);

dispatch_sync(my_serial_queue, ^{
NSLog(@"Task 1");
});

dispatch_sync(my_serial_queue, ^{
NSLog(@"Task 2");
});

现在,按照规则,两个任务都将串行执行,因为它是串行队列,即任务 A 首先执行,然后在任务 A 完成后执行任务 B。而且它还在日志中给我相同的输出。

那么,我的问题是,如果我想同时执行这两个任务怎么办?如果这个问题的答案是为任务 B 创建另一个串行队列,那么代码的结构应该是这样的:

dispatch_queue_t my_serial_queue_1 = dispatch_queue_create("queue_identifier_1", 0);
dispatch_queue_t my_serial_queue_2 = dispatch_queue_create("queue_identifier_2", 0);


dispatch_sync(my_serial_queue_1, ^{
NSLog(@"Task 1");
});

dispatch_sync(my_serial_queue_2, ^{
NSLog(@"Task 2");
});

我得到了相同的输出。原因是我使用的是“dispatch_sync”调用而不是“dispatch_async”调用。但是当我在不同的队列中运行这两个任务时,它们不应该同时执行吗?如果不是,那我们为什么要创建一个不同的队列?我可能通过“dispatch_async”调用使用相同的队列来同时执行这两个任务。

我真的需要这个问题的答案,因为在未来设计我的多任务应用程序结构之前,它会更好地指导我。

最佳答案

您的困惑几乎完全是因为您使用的是 dispatch_sync。 dispatch_sync 不是一个获取并发执行的工具,它是一个为了安全临时限制它的工具。

使用 dispatch_async 后,您可以通过拥有多个队列或使用并发队列来获得并发性。在此上下文中使用串行队列的目的是控制同时完成哪些工作。

考虑以下非常愚蠢的例子:

__block void *shared = NULL;
for (;;) {
dispatch_async(aConcurrentDispatchQueue, ^{
shared = malloc(128);
free(shared);
}
}

这会崩溃,因为最终,两个并发执行的 block 将连续释放“共享”。这显然是一个人为的例子,但在实践中,几乎所有共享的可变状态都不能同时更改。串行队列是您确保这样做的工具。

总结:

  • 当您的 block 中的工作真正独立且线程安全且纯计算时,请继续并发队列使用 dispatch_async
  • 当你有逻辑上独立的任务,每个任务都包含几个相关的 block 时,为每个任务使用一个串行队列
  • 当您有访问共享可变状态的工作时,在串行队列上的 dispatch_sync()ed block 中执行这些访问,并在并发队列上执行其余工作
  • 当你需要做UI相关的工作时,dispatch_asyncdispatch_sync到主队列,取决于你是否需要等待它完成

关于ios - dispatch_queue_t 是串行队列那么为什么它甚至存在于多任务概念中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25781515/

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