В GCD есть ли способ определить, является ли текущая очередь параллельной или нет?

В GCD есть ли способ определить, является ли текущая очередь параллельной или нет? В настоящее время я пытаюсь выполнить отложенное сохранение в некоторых контекстах управляемых объектов, но мне нужно убедиться, что очередь, в которой в данный момент выполняется код, является потокобезопасной (в синхронной очереди).


person Patrick    schedule 18.08.2011    source источник


Ответы (2)


Если вам действительно нужно определить, является ли переданная вам очередь последовательной или параллельной, вы почти наверняка спроектировали что-то неправильно. Как правило, API скрывает внутреннюю очередь как деталь реализации (в вашем случае контексты общих объектов), а затем ставит операции в очередь для своей внутренней очереди, чтобы обеспечить безопасность потоков. Однако, когда ваш API принимает блок и очередь в качестве параметров, предполагается, что переданный блок может быть безопасно запланирован (асинхронно) для переданной очереди (когда, скажем, операция завершена), а остальная часть код учитывается соответствующим образом.

person jkh    schedule 01.11.2011

Да, если вы выполняете работу в NSOperation:

[myOperation isConcurrent] //or self, if you're actually in the NSOperation

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

NSOperationQueue * synchronousQueue = [[NSOperationQueue alloc] init];
[synchronousQueue setMaxConcurrentOperationCount:1];

GCD требует некоторого планирования заранее. Единственный другой способ, который я могу придумать, - это наблюдать значение isExecuting (или подобное) на ваших объектах NSOperation. Ознакомьтесь с эта ссылка на это. Это решение будет более сложным, поэтому я надеюсь, что другое сработает для вас.

person Stephen Searles    schedule 18.08.2011
comment
Я думаю, что моя проблема на уровень глубже. Я уже выполняю код внутри очереди и пытаюсь получить информацию о текущей запущенной очереди GCD и о том, является ли она параллельной или нет. - person Patrick; 18.08.2011
comment
Хорошо, проверьте это. Сейчас есть еще пара вариантов. - person Stephen Searles; 18.08.2011
comment
Operation.isConcurrent/asyncronous не имеет ничего общего с тем, есть ли у OperationQueue, выполняющего операцию, параллельная базовая очередь. - person jaetzold; 08.02.2019