假设我有一个信号量来控制对dispatch_queue_t的访问,在调度调度队列上的一个块之前,我等待信号量(dispatch_semaphore_wait)。
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
我试图弄清楚的下一步是如何在一个事务之前运行另一个事务。
发布于 2014-11-16 18:03:32
您在这里滥用了API。您不应该使用信号量来控制调度到调度队列的内容。
如果您想序列化队列中块的执行,那么使用串行队列而不是并发队列。
如果您正在排队的不同块具有不同的优先级,那么您应该使用OSX10.10和iOS 8.0中添加的QOS机制来表示不同的优先级。如果您需要在较旧的系统上运行,那么您可以使用不同优先级的全局并发队列来执行适当的工作。除此之外,对较旧的系统没有太多的控制。
此外,信号量本质上不利于优先级继承,因为系统无法确定谁将向信号量发出信号,因此很容易导致以下情况:较高优先级的线程将被阻塞很长时间,等待较低优先级的线程发出信号。这称为优先级反转。
https://stackoverflow.com/questions/26949128
复制相似问题