Нужно ли синхронизировать доступ к простому значению при использовании из нескольких очередей? - PullRequest
0 голосов
/ 02 сентября 2018

Рассмотрим следующий пример:

@implementation AppDelegate
{
    UIDeviceOrientation _orientation;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    UIDevice *device = [UIDevice currentDevice];
    _orientation = device.orientation;
    [[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceOrientationDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
        // setting _orientation happens on the main thread
        _orientation = device.orientation;
    }];

    return YES;
}

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
    // accessing _orientation on a background queue
    [self _doStuffWithBuffer:sampleBuffer orientation:_orientation];
}

@end

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

В подобных примерах это нормально, если основная очередь иногда записывает простые значения, а фоновая очередь их читает? Я мог бы обернуть все операции чтения и записи в os_unfair_lock, но я надеюсь избежать удачного попадания в блокировку в случае чтения, что часто случается.

Если этот пример в порядке, то в каких случаях он не в порядке? Я предполагаю, что чтение / запись объектов не нужны; что насчет структур?

...