假设我有一个信号量来控制对dispatch_queue_t的访问。 我在调度队列上调度块之前等待信号量(dispatch_semaphore_wait)。
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER)
dispatch_async(queue){ //do work ; dispatch_semaphore_signal(semaphore); }
假设我在几个不同的位置等待工作。一些"工作"优先于其他工作"工作"。
有没有办法控制哪些"工作"将在下一个安排?
附加信息:使用没有信号量的串行队列对我来说不是一个选项,因为"工作"由自己的队列和几个块组成。所有工作队列都必须运行,或者都不运行。没有工作队列可以同时运行。除了优先级控制之外,我所有这些工作正常。
编辑:(回应杰里米,从评论中移出)
好的,假设您有一台设备/文件/类似打印机。打印作业由在事务中组合在一起的多个函数调用/块(打印标题,然后是打印图形,然后是打印文本......)组成。将这些块放在串行队列中。每笔交易一个队列。
但是,您可以拥有多个打印作业/事务。来自不同打印作业/事务的块不能混合使用。那么如何确保事务队列运行其所有作业以及在另一个队列完成之前未启动事务队列? (我不打印,只是以此为例)。
信号量用于规范有限资源的使用。 https://www.mikeash.com/pyblog/friday-qa-2009-09-25-gcd-practicum.html Concurrency Programming Guide
我想弄清楚的下一步是如何在另一个交易之前运行一个交易。
答案 0 :(得分:1)
您在这里滥用了API。您不应该使用信号量来控制调度队列的调度内容。
如果要序列化队列中块的执行,则使用串行队列而不是并发队列。
如果您要排队的不同块具有不同的优先级,则应使用OS X 10.10和iOS 8.0中添加的QOS机制表示不同的优先级。如果需要在较旧的系统上运行,则可以使用不同的优先级全局并发队列进行适当的工作。除此之外,旧系统没有太多控制权。
此外,信号量固有地反对优先级继承,因为系统无法确定谁将发信号通知信号量,因此您可以很容易地在更高优先级的线程将被阻塞很长时间等待的情况下结束一个较低优先级的线程来发信号通知信号量。这称为优先级倒置。