首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用信号量进行优先级控制

使用信号量进行优先级控制
EN

Stack Overflow用户
提问于 2014-11-16 02:19:13
回答 1查看 647关注 0票数 1

假设我有一个信号量来控制对dispatch_queue_t的访问,在调度调度队列上的一个块之前,我等待信号量(dispatch_semaphore_wait)。

代码语言:javascript
运行
复制
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER)
dispatch_async(queue){ //do work ; dispatch_semaphore_signal(semaphore); }

假设我在几个不同的位置有工作在等待。一些“工作”比其他“工作”具有更高的优先级。

有没有办法控制下一步会安排哪些“工作”?

附加信息:使用没有信号量的串行队列对我来说不是一个选择,因为“工作”是由它自己的队列和几个块组成的。所有工作队列都必须运行,或者一个都不运行。没有工作队列可以同时运行。除了优先级控制之外,我所有的这些都工作得很好。

编辑:(为了回应Jeremy,从评论中移出)

好的,假设你有一个设备/文件/任何东西,比如打印机。打印作业由多个函数调用/块组成(打印标题,然后打印图形,然后打印文本,...)在一个事务中组合在一起。将这些块放到串行队列中。每个事务一个队列。

但是,您可以有多个打印作业/事务。来自不同打印作业/事务的块不能混合。那么,如何确保一个事务队列运行它的所有作业,并且一个事务队列不会在另一个队列完成之前启动?(我不是在打印,只是以此为例)。

信号量用于规范有限资源的使用。https://www.mikeash.com/pyblog/friday-qa-2009-09-25-gcd-practicum.html Concurrency Programming Guide

我试图弄清楚的下一步是如何在一个事务之前运行另一个事务。

EN

回答 1

Stack Overflow用户

发布于 2014-11-16 18:03:32

您在这里滥用了API。您不应该使用信号量来控制调度到调度队列的内容。

如果您想序列化队列中块的执行,那么使用串行队列而不是并发队列。

如果您正在排队的不同块具有不同的优先级,那么您应该使用OSX10.10和iOS 8.0中添加的QOS机制来表示不同的优先级。如果您需要在较旧的系统上运行,那么您可以使用不同优先级的全局并发队列来执行适当的工作。除此之外,对较旧的系统没有太多的控制。

此外,信号量本质上不利于优先级继承,因为系统无法确定谁将向信号量发出信号,因此很容易导致以下情况:较高优先级的线程将被阻塞很长时间,等待较低优先级的线程发出信号。这称为优先级反转。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26949128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档