2014-11-15 3 views
1

Предположим, у меня есть семафор для контроля доступа к dispatch_queue_t. Я жду семафора (dispatch_semaphore_wait) перед планированием блока в очереди отправки.приоритет управления с помощью семафора

dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER) 
dispatch_async(queue){ //do work ; dispatch_semaphore_signal(semaphore); } 

Предположим, у меня есть работа в нескольких отдельных местах. Некоторые «работы» имеют более высокий приоритет, чем другая «работа».

Есть ли способ контролировать, какая из «работ» будет запланирована следующая?

Дополнительная информация: использование серийной очереди без семафора не является для меня вариантом, поскольку «работа» состоит из собственной очереди с несколькими блоками. Вся рабочая очередь должна запускаться, или ни одна из них. Никакие рабочие очереди не могут выполняться одновременно. У меня все это работает отлично, за исключением контроля приоритета.

Edit: (в ответ на Джереми, переехал из комментариев)

Ок, предположим, что у вас есть устройство/файл/независимо от типа принтера. Задача печати состоит из нескольких вызовов/блоков функций (печатайте заголовок, затем печатайте рисунок, затем печатайте текст, ...), сгруппированные вместе в транзакции. Поместите эти блоки в последовательную очередь. Одна очередь за транзакцию.

Однако вы можете иметь несколько заданий/транзакций печати. Блоки из разных заданий/транзакций печати нельзя смешивать. Итак, как вы гарантируете, что очередь транзакций выполняет все свои задания и что очередь транзакций не запускается до того, как закончится другая очередь? (Я не печатаю, просто используя это в качестве примера).

Семафоры используются для регулирования использования конечных ресурсов. https://www.mikeash.com/pyblog/friday-qa-2009-09-25-gcd-practicum.html Concurrency Programming Guide

Следующим шагом я пытаюсь выяснить, как запустить одну транзакцию перед другим.

+0

Выполнение одной транзакции перед другой - это именно то, для чего предназначены последовательные очереди. Вы должны сделать каждую транзакцию блоком в очереди. Отключите использование семафора, так как это может привести к инверсии приоритетов. –

+0

ОК, я буду инвертировать приоритет google и пересмотреть. – user965972

ответ

1

Вы неправильно используете API здесь. Вы не должны использовать семафоры для управления запланированными очередями отправки.

Если вы хотите сериализовать выполнение блоков в очереди, используйте последовательную очередь, а не параллельную очередь.

Если разные блоки, которые вы ставите в очередь, имеют другой приоритет, тогда вы должны выразить этот различный приоритет, используя механизмы QOS, добавленные в OS X 10.10 и iOS 8.0. Если вам нужно запускать более старые системы, вы можете использовать разные глобальные параллельные очереди приоритетов для соответствующей работы. Помимо этого, не существует большого контроля над более старыми системами.

Кроме того, семафоры по своей сути работают против наследования приоритетов, поскольку система не может определить, кто будет сигнализировать о семафоре, и поэтому вы можете легко оказаться в ситуации, когда поток с более высоким приоритетом будет заблокирован в течение длительного времени для потока с более низким приоритетом для сигнализации семафора. Это называется инверсией приоритета.

+0

Каждая транзакция должна быть единственным блоком в очереди. Вы можете выполнить все более мелкие блоки, являющиеся кусками транзакции, в одном блоке в очереди. –

+0

Затем вы блокируете очередь, если у вас много работы, которая не связана с ресурсом.Предположим, вам нужно извлечь 1M строк из базы данных, вычислить материал (длинная работа) и затем вернуть ответ в базу данных. Вы не хотите блокировать очередь базы данных, пока вы хрустаете цифры в фоновом режиме. – user965972

+1

Тогда вы не должны выполнять обработку в очереди доступа db. Получите данные из db в очереди db, затем запустите обработку в фоновом режиме, а затем добавьте результат в очередь db. если вы пытаетесь сделать доступ на чтение/запись, вы должны использовать параллельную очередь, используя барьеры для записи. –

Смежные вопросы