【发布时间】:2013-02-06 11:23:13
【问题描述】:
我知道我可以使用dispatch_async 和dispatch_get_global_queue 异步执行任务。
但是 dispatch_async 创建了多少线程? 我应该怎么做才能用 GCD 准确地执行 N 个(不多也不少)线程,并在它们上执行一些任务?执行任务后,我需要在已发布的线程中添加新任务,可能在前一个任务的编译块中。
或者也许我可以用NSOperationQueue 控制线程数?
我知道它有属性maxConcurrentOperationCount,但它只控制任务的最大限制。那么,如果我设置 maxConcurrentOperationCount = 8 并向NSOperationQueue 添加 12 个操作,我可以确定 NSOperationQueue 创建不少于 8 个线程吗?
非常感谢!
【问题讨论】:
-
为什么?使用 GCD 的原因是为了避免我们寻找最佳线程数。如果你想要 N 个线程,然后使用 NSThread 自己创建它们
-
实践中没有理由,只是为了研究。
-
maxConcurrentOperationCount只是一个最大值。它可以创造更少。如果您需要精确控制线程数,则必须自己管理它们。 -
@xlc 这很有用的原因是,如果您的应用程序调度太多操作,您会占用系统,最终阻塞进程中的主队列。我觉得它是 GCD 中一个相当明显的遗漏,以及为什么我现在通常使用操作队列。这种遗漏破坏了 GCD 对大规模并行操作的许多好处。
-
@Rob 我知道在 osx 中有最大 64 个工作线程的限制,不确定 ios。如果 CPU 没有被充分利用(这就是使用 GCD 的全部意义),GCD 也只会产生新线程。我同意使用 GCD 创建 64 个繁忙的工作线程是可能的,但如果你正确使用它就不太可能发生。
标签: iphone ios multithreading asynchronous grand-central-dispatch