关于IOS全局队列,这是一个好主意,我们可以通过子线程利用它来利用多核CPU,但现在我的问题是如何管理这些子线程从队列中调度后? Apple 似乎没有提供这样的 API。
例如,我创建了一个串行队列,如果一个作业由于某种原因被阻塞,那么整个队列也会被阻塞。其实我们想管理这个工作,目前好像没找到方法。
任何讨论将不胜感激,在此先感谢。
最佳答案
一旦一个 block 被分派(dispatch)到一个队列,它就会执行。没有 API 可以阻止它。
您可以暂停
队列,这将导致待处理的 block 在队列恢复之前不会执行。但是,没有办法阻止 block 。
常规方法是在您的代码中进行“检查”以查看正在运行的 block 是否应该提前停止。
// return early from block
if (shouldStop) return;
请注意,您所看到的“问题”是串行队列的确切定义。它只允许操作按照它们提交到队列的顺序进行处理。您必须等待前面的完成。
您还可以查看 NSOperationQueue
,它提供了一种更简单的机制来取消在队列中等待的 block ,但是停止正在执行的 block 的唯一方法是让您在你的街区。
如果您发现必须取消大量“阻塞” block ,那么您的设计很可能存在缺陷,您需要重新审视您的设计。
此外,如果正在等待的任务“后面”的任务真的不需要等待该任务,那么为什么要将它们放在串行队列中的后面呢?使用并发队列、单独的串行队列或其他一些机制。
现在,让我声明您真的不应该使用调度队列来阻塞 I/O 操作。您可以做到,而且通常这是最简单的方法,但如果您希望应用获得最佳性能特征,则应使用 dispatch_io
,它将更好地与其他 CPU 密集型线程集成。
我想这里最大的收获应该是,而不是试图得到诸如“当当前正在运行的 block 被阻塞时,如何在串行队列上运行 block ?”之类的问题的答案。您应该问自己如何才能更好地设计您的应用程序,以免出现这种情况。
如果工作不必执行,则不要等待。如果工作必须完成,他们只需要等待...
关于ios - 关于IOS中的全局队列。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12339046/