1

GCD を使用して、画像エディター ビューで「バックグラウンドで」いくつかの画像処理操作を実行しています。問題は、エディター ビューを開き、何らかの処理を行った後、エディター ビューに 10 ~ 20 分間座っていると、これらのOSSpinLockLockフリーズが発生しますが、使用SpinLocksまたはロックは一切行われておらず、次のプロパティがあります。

@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>....
    }];
});

どういうわけかセマフォかどうか疑問に思っています。

4

2 に答える 2

2

libdispatch は、キューまたはセマフォの実装で OSSpinLockLock を使用しませんが、malloc は使用します (したがって、libdispatch が dispatch_async の一部として呼び出す Block_copy)。

OSSpinLockLock でブロックされているときに、すべてのスレッドのバックトレースを表示できますか?

于 2013-03-08T04:55:06.260 に答える