【问题标题】:Which is the best of GCD, NSThread or NSOperationQueue? [closed]GCD、NSThread 或 NSOperationQueue 哪个最好? [关闭]
【发布时间】:2012-10-11 07:31:02
【问题描述】:

由于我们有 GCD、NSThreadNSOperationQueue 三个选项,iOS 中多线程的最佳方式是什么?我很困惑哪一个是最好的?如果没有,那么应该在什么情况下使用哪个以及它们有何不同,如果有人有一些使用NSOperationQueue的好例子,请分享以便我学习。

【问题讨论】:

  • 定义“最佳”。最快、最轻、最容易使用?
  • 这是一个无法回答的问题,除非您有特定的用例。三者中没有通用的“最佳”。

标签: ios multithreading grand-central-dispatch nsthread nsoperationqueue


【解决方案1】:

简单回答:

  1. 当您想要或需要直接控制您创建的线程时,请使用 NSThread(甚至是 pthreads API),例如您需要对线程优先级进行细粒度控制,或者与其他一些直接销售/使用线程对象的子系统交互,并且您需要与它保持在同一页面上。这种情况很少见,但确实会发生,尤其是在实时应用程序中。

  2. 当您的任务非常适合简单的并行化时使用 GCD,例如你只是想把一些工作“扔到后台”,只需要很少的额外工作,你有一些你只想序列化访问的数据结构(串行队列非常适合以无锁的方式做到这一点),你有一些循环可以很好地与 dispatch_apply() 进行并行化,您有一些数据源/计时器,GCD 的源 API 将使您能够在后台轻松处理等等。GCD 非常强大,您可以使用它很多不仅如此,但这些都是相对“不费吹灰之力”的场景,您不想陷入初始化和设置任务中,而只是“并行执行基本工作”。

  3. 当您已经在 Cocoa API 层(而不是直接用 C 语言编写 POSIX API)并且想要并行化更复杂的操作时,请使用 NSOperation。 NSOperation 允许子类化、任意复杂的依赖图、取消和支持许多其他可能对您有用的高级语义。 NSOperation 实际上在幕后使用 GCD,因此它与 GCD 一样具有多核、多线程能力,尽管它也带来了 Foundation 框架,所以如果你在 POSIX 层进行黑客攻击,你可能想要使用选项 #2。

然而,正如其他人所说,这完全取决于您要做什么,因此您的问题没有单一甚至普遍正确的答案。

【讨论】:

  • KUdos,...@jkh ......这就是我想知道的。现在,有人与我讨论。好的,所以你说的是第 2 点,我目前正在使用 2。但是,我在想是否可以根据其他线程或队列所花费的时间在运行时设置线程的优先级。假设,一个线程占用超过 3 分钟,我想降低它的优先级并增加第二个的优先级。
  • 另外,我们在 ios 中有 dispatch_global 队列,它们本质上是并发的。当我们为其分配代码块时,这是否比创建一个新的自定义并发队列并向其添加块更好?还是一样???我们可以设置我们创建的这些队列的优先级吗???
  • 在设置线程优先级之前,首先要问的问题是“为什么?”我将实时应用程序(例如音频、视频处理)作为这样做的主要原因,因为很少需要这样做。 GCD 在全局并发队列中提供 4 级优先级(后台、低、中、高),这几乎总是足以满足应用程序的需求。如果一个线程需要 3 分钟才能完成,那么设置优先级将无济于事 - 要么将其分解为更小的任务,要么让操作系统为长期运行的线程与短期线程动态设置优先级(它会)
  • 关于使用全局并发队列与您自己创建的自定义队列,这完全取决于。当您想将状态与队列关联(dispatch_{set,get}_specific())或由于其他原因(例如,您想暂停/恢复它们)而无法使用全局队列时,您通常会创建自己的队列。否则使用全局队列就好了,特别是当你自己创建的队列都以相同的优先级运行时,这与 4 个全局并发队列不同(见上面的评论)。
  • 好的,这很有帮助......它很好地清除了我正在寻找的范围......谢谢
【解决方案2】:

我最近一直倾向于 NSOperationQueue。这在内部使用 GCD,并且是线程安全的,而且使用起来非常简单。

【讨论】:

  • 但有人可能会争辩说,放弃 NSOperationQueue 并直接降到 GCD 级别肯定会更快。
  • NSOperationQueue 在任务是离散的、同步的并且存在于同一个线程中时效果最好(例如它们或多或少是原子的),尽管在几乎任何情况下,队列都可以用作基本线程池。跨度>
猜你喜欢
  • 2012-05-24
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2011-03-19
相关资源
最近更新 更多