Objective c 大中央调度vs NSThreads?

Objective c 大中央调度vs NSThreads?,objective-c,multithreading,macos,cocoa,grand-central-dispatch,Objective C,Multithreading,Macos,Cocoa,Grand Central Dispatch,我搜索了各种源代码,但并不真正理解使用NSThreads和GCD之间的区别。我对OSX平台完全陌生,所以我可能完全误解了这一点 从我在线阅读的内容来看,GCD似乎与基本线程(POSIX、NSThreads等)做了完全相同的事情,同时添加了更多的技术术语(“块”)。它似乎使基本线程创建系统(创建线程、运行函数)过于复杂 GCD到底是什么?为什么它会比传统线程更受欢迎?什么时候应该使用传统线程而不是GCD?最后,GCD奇怪的语法有什么原因吗?(“块”而不是简单地调用函数) 我在Mac OS X 10

我搜索了各种源代码,但并不真正理解使用
NSThreads
和GCD之间的区别。我对OSX平台完全陌生,所以我可能完全误解了这一点

从我在线阅读的内容来看,GCD似乎与基本线程(POSIX、
NSThreads
等)做了完全相同的事情,同时添加了更多的技术术语(“块”)。它似乎使基本线程创建系统(创建线程、运行函数)过于复杂

GCD到底是什么?为什么它会比传统线程更受欢迎?什么时候应该使用传统线程而不是GCD?最后,GCD奇怪的语法有什么原因吗?(“块”而不是简单地调用函数)


我在Mac OS X 10.6.8 Snow Leopard上,我不是为iOS编程,我是为Mac编程。我正在Cocoa中使用Xcode 3.6.8,创建一个GUI应用程序。

调度的优势

调度的优势主要概述如下:

这样做的目的是消除您自己的工作,因为范例更容易适合大多数代码

  • 它减少了应用程序为在应用程序内存空间中存储线程堆栈而支付的内存开销
  • 它消除了创建和配置线程所需的代码
  • 它消除了管理和调度线程工作所需的代码
  • 它简化了您必须编写的代码
根据经验,使用GCD类型锁定而不是
@synchronized
大约快80%或更多,尽管微基准测试可能是欺骗。请阅读更多内容,尽管我认为异步写入的建议在许多情况下并不适用,而且速度较慢(但它是异步的)

线程的优点

为什么要继续使用线程?同一文件:

重要的是要记住,排队不是解决问题的灵丹妙药 更换螺纹。提供的异步编程模型 队列适用于延迟不是问题的情况。 即使队列提供了配置执行优先级的方法 队列中的任务,较高的执行优先级不能保证 在特定时间执行任务。因此,线程仍然是一个问题 在需要最小延迟的情况下,更合适的选择,例如 如音频和视频播放

我个人还没有找到使用队列的理想解决方案的另一个地方是需要不断重新调度的守护进程。并不是说不能重新调度它们,而是在NSThread方法中循环更简单(我认为)Edit:现在我确信,即使在这种情况下,GCD样式的锁定也会更快,而且您还可以在GCD调度的操作中执行循环

目标C中的块?

由于糟糕的语法,Objective-C中的块非常糟糕(尽管Xcode有时至少有助于自动完成)。如果您查看Ruby(或其他语言)中的块,您将看到它们对于调度操作是多么简单和优雅。我想说,您将习惯于Objective-C语法,但我真的认为您将习惯于大量复制示例:)


你可能会发现这很有帮助,或者只是分散了你的注意力。不确定。

块允许传递要执行的代码块。一旦你越过了“奇怪的语法”,它们就相当强大了

GCD还使用队列,如果使用得当,如果在单独队列中执行的代码是隔离的,那么队列可以帮助实现无锁并发。这是一种更简单的方法,可以提供后台和并发性,同时最大限度地减少死锁(如果使用正确的话)

“奇怪的语法”是因为他们选择了插入符号(^),因为它是C中为数不多的没有作为运算符重载的符号之一++

见:

在向应用程序添加并发性时,调度队列 与线程相比,它有几个优点。最直接的好处是 工作队列编程模型的简单性。用线,你 必须为您想要执行的工作和目标编写代码 线程本身的创建和管理。调度队列 你专注于你真正想做的工作,而不必去做 担心线程的创建和管理。相反,系统 为您处理所有线程的创建和管理。这个 优点是系统能够更有效地管理线程 比任何单个应用程序都要高效。该系统可以 根据可用线程数动态调整线程数 资源和当前系统条件。此外,该系统是 通常能够比在以下情况下更快地开始运行任务 你自己创建了线程

尽管您可能认为重写调度队列的代码会 虽然困难,但为调度队列编写代码通常更容易 而不是为线程编写代码。编写代码的关键是 设计自包含且能够运行的任务 异步的。(实际上,线程和分派都是如此 排队。)

虽然您可以正确地指出,在 串行队列不会同时运行,您必须记住,如果 线程在同一时间获得锁,由 线程丢失或显著减少。更重要的是 线程模型需要创建两个线程,这两个线程占用 内核和用户空间内存。调度队列支付的费用不同 它们的线程的内存惩罚,并且它们确实使用的线程被保留 忙而不阻塞


虽然到目前为止的答案是关于单个应用程序域内线程与GCD的上下文以及它在编程方面的差异,但您应该始终选择GCD的原因是因为mult