19

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

+1

定义“最佳”。最快,最轻,最容易使用? – CodaFi

+0

这是一个无法回答的问题,除非你有一个特定的用例。三者中没有通用的“最好”。 – jrturton

回答

35

答案很简单:

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

  2. 当您的任务适合于简单的并行化时使用GCD,例如,你只是想通过很少的额外工作就可以将一些工作“投入到后台”,你有一些数据结构,你只是希望序列化访问(并且串行队列非常适合以无锁方式进行访问),但你有一些循环可以很好地利用dispatch_apply()进行并行化,你有一些数据源/定时器,GCD的源API可以让你在后台轻松处理等等.GCD功能非常强大,你可以使用它很多不止这些,但是这些都是相对的'没有脑子'的情况,你不想陷入初始化和设置任务,而只是简单地“平行地做基本的东西”。

  3. 当你已经在Cocoa API层(vs直写C到POSIX API)时使用NSOperation并且有更复杂的操作要并行化。 NSOperation允许子类化,任意复杂的依赖关系图,取消和支持许多其他可能对您有用的高级语义。 NSOperation实际上在封面下使用GCD,所以它与GCD一样具有多核心,多线程的能力,尽管它也为基础框架带来了基础框架,所以如果你在黑客入侵POSIX层,你可能想要使用选项#2。

正如其他人说,然而,这一切都取决于你试图这样做,没有单一的,甚至普遍正确的回答你的问题。

+1

KUdos,... @ jkh ......这就是我想知道的。现在,有一些人与我在一起讨论。好的,所以你说了关于点2,我目前正在使用2.但是,我想如果可以在运行时基于其他线程或队列所花费的时间来设置线程的优先级。假设一个线程的时间超过3分钟,我想降低它的优先级并增加第二个的优先级。 – Sumitiscreative

+0

另外,因为我们在ios中有dispatch_global队列,它们本质上是并发的。当我们将代码块分配给它然后,这比创建一个新的自定义并发队列并将块添加到它好吗?或其相同?我们可以设置我们创建的这些队列的优先级吗? – Sumitiscreative

+2

在设置线程的优先级之前,首先要问的是“为什么?“我引用实时应用程序(例如音频,视频处理)作为这样做的主要原因,因为它很少需要这样做,否则GCD在全球并发队列中提供4级优先级(背景,低,中,高),对于应用程序的需求几乎总是足够的如果一个线程需要3分钟才能完成,设置优先级将无济于事 - 或者将其分解为更小的任务,或者让操作系统为长时间运行的线程动态设置优先级, (和它会) – jkh

0

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

+0

但有人可能会认为,摆脱NSOperationQueue肯定会更快,并且简单地下降到GCD级别。 – CodaFi

+0

NSOperationQueue在任务离散,同步和活在同一线程中时(例如,它们或多或少是原子的),在几乎任何情况下都可以用作基本线程池,因此它的工作效率最高。 –

相关问题