我有5个需要在单独的线程上运行的函数。 Grand Central Dispatch应该比线程更有效,所以我决定使用它。每个函数都有一个无限循环 - while(true)
- 在整个程序期间运行。因此,在程序存在之前,函数不会返回。但事实是,GCD不会同时运行队列 - 它一次运行一个队列。当第一个队列完成时,它开始第二个队列。如果我将每个函数放在一个队列中,那么只有一个函数会运行,因为Grand Central Dispatch将等待第一个函数返回运行下一个函数,但该函数将永远不会返回(因为它是一个无限循环)。有什么办法可以使用GCD和无限循环函数吗?或者我应该只使用线程?
Mac OSX Snowleopard 10.6.8上的Xcode 3.2.6。
答案 0 :(得分:4)
男孩,到目前为止,很多困惑/混淆的答案!
首先,你没有理由在这里使用线程。没有。使用GCD,即使是“长时间运行”操作,也完全没问题。如果您正在从所述操作中执行的操作是读取数据然后对数据执行某些操作,那么您当然应该使用调度源或dispatch_io,因为这就是它们的用途,它们可以极大地简化代码,还可以根据需要创建线程但是如果你真的喜欢拥有多个长期运行的并行操作的概念,那么只需将每个操作包装到一个块中,然后将这些块分配给一个全局并发队列。它们将并行运行。如果你所拥有的更多的是“多个工作流程”,其中每个工作流代表一个独特的操作链,需要连续发生但与其他工作流并行,然后为每个工作流和独立序列创建一个串行队列队列将相互并发运行。就这么简单! GCD经常会混淆那些期望事情变得复杂的人,或者来自经典线程背景并尝试将一个概念映射到另一个概念的人。不要这样做,你会有一个更容易的时间。 :)
答案 1 :(得分:2)
Grand Central Dispatch的重点是允许需要异步执行的任务,但不需要并发运行的线程,可以有效地排队而不会产生额外的线程。
但是,如果你的函数需要在程序的生命周期内连续执行,你应该继续使用线程:这就是它们存在的原因,并且在某些情况下它们是完全合理的。
但是,您可以将函数重构为不需要无限循环(例如,您可能在函数完成其工作时调用函数dispatch_async
,以便将其调度为很快就会再次运行,或者理想情况下,只有在需要执行某些操作时才会使用GCD来调用函数。
如果你指定你的功能是什么以及你想要实现什么,我会更有帮助。
答案 2 :(得分:2)
听起来像是在使用dispatch_sync。看看dispatch_async。
它会立即返回,您可以同时启动多个队列,每个功能都在一个单独的队列中。