ios - 关于IOS中的全局队列。

标签 ios queue block

关于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/

相关文章:

multithreading - 单独 TThread block GUI 线程中的操作

ios - 获取索引路径 如果用户在 UITableview 中编辑 UITextfield

ios - RealmSwift 数据过滤

ios - SWIFT:动画会改变速度,这是我不想要的

c - QUEUE宏的使用

file - 测试来自 `ls/dev` 的字符串并只回显 block 文件

ios - 响应式菜单,iPad横屏模式的困境

c - 在C中设计队列。向队列添加元素时出现段错误

c - C 中的信号排队

objective-c - 异步传递值