1

Мы используем GCD для выполнения некоторых операций обработки изображений «в фоновом режиме» в нашем представлении редактора изображений, который отлично работает. Проблема в том, что если мы открываем представление редактора, делаем некоторую обработку, а затем просто сидим в редакторе в течение 10-20 минут, мы получаем зависания OSSpinLockLock, но мы не используем SpinLocks или замки любого типа, у нас есть следующие свойства:Получение OSSpinLockLock при использовании Grand Central Dispatch (GCD)

@property (nonatomic, readonly) dispatch_semaphore_t processingSemaphore; 
@property (nonatomic, readonly) dispatch_queue_t serialQueue; 

и настройка очередей, как так:

processingSemaphore = dispatch_semaphore_create(1); 
serialQueue = dispatch_queue_create("com.myapp.imageProcessingQueue", NULL); 
dispatch_set_target_queue(serialQueue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, NULL)); 

и процесс таким образом:

dispatch_async(self.serialQueue, ^{ 
    dispatch_semaphore_wait(self.processingSemaphore, DISPATCH_TIME_FOREVER); 

    ....<do stuff>.... 

    dispatch_semaphore_signal(self.processingSemaphore); 

    dispatch_sync(dispatch_get_main_queue(), ^{ 
     ....<notify that we're done>.... 
    }]; 
}); 

Я интересно, если его семафор каким-то образом.

ответ

0

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

serialQueue = dispatch_queue_create("com.myapp.imageProcessingQueue", DISPATCH_QUEUE_SERIAL); 

Это обеспечит выполнение только одного блока за раз.

Вы не можете отменить операции в этой очереди. Для этого вам нужно будет использовать NSOperationQueue.

+0

Вы правы, если я использую последовательную очередь, тогда мне не нужен семафор. Отмена в порядке, я имею дело с этим с помощью '_stopProcessing' boolean. – Shizam

2

libdispatch не использует OSSpinLockLock как в очереди, так и в реализации семафора, но malloc делает (и, таким образом, Block_copy, которую libdispatch вызывает как часть dispatch_async).

Можете ли вы показывать обратные трассы всех потоков, когда вы заблокированы в OSSpinLockLock?

+0

Вот еще трассировка на нем: http://tinyurl.com/aju9dmw – Shizam

+1

К сожалению, это не помогает, соответствующая информация находится в промежуточных кадрах, которые скрываются Xcode. Вероятно, проще всего просто запустить «thread backtrace all» в lldb (консоль отладчика Xcode). – das

+0

Я правильно интерпретирую ваш ответ, что при копировании любых объектов в блок (путем ссылки на объекты за пределами блока) это может вызвать проблему? т.е. внутри блока я ссылаюсь на объект за пределами блока, который также одновременно ссылается на основной поток. – Shizam

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