这段代码可以保留thread-salfe?(IOS)

时间:2014-08-05 16:05:45

标签: ios multithreading

这是班级:

@interface PhotoManager ()
    @property (nonatomic,strong,readonly) NSMutableArray *photosArray;
    @property (nonatomic, strong) dispatch_queue_t concurrentPhotoQueue;
@end

我想使属性photosArray(setter和getter)线程安全:

- (void)addPhoto:(Photo *)photo
{
    if (photo) {
        dispatch_barrier_async(self.concurrentPhotoQueue, ^{ 
            [_photosArray addObject:photo];
            dispatch_async(dispatch_get_main_queue(), ^{
                //Notification to update the UI; 
            });
        });
    }
}

和getter方法:

 - (NSArray *)photos
    {
        __block NSArray *array;
        dispatch_sync(self.concurrentPhotoQueue, ^{
            array = [NSArray arrayWithArray:_photosArray];
        });
        return array;
    }

但是apple开发文档说:"作为优化,该函数在可能的情况下调用当前线程上的块。" 因此,如果concurrentPhotoQueue队列不是"当前队列",则concurrentPhotoQueue中的屏障可能不会阻止其他线程,例如getter可能在主线程中调用。换句话说,如果一个线程设置mutableArray并且其他线程同时读取mutableArray,则getter方法仍然不是线程安全的。

我的意见是对的吗?如果是这样,我该如何修改getter方法? 注意:我从博客中引用这些代码。

1 个答案:

答案 0 :(得分:0)

优化通常会在他们不打破默认行为时跳入。

当没有其他线程添加照片时,可能会在主线程上执行getter。现在,如果一个线程突然进入addPhotos方法,而photos getter在主线程上运行 - 作为优化选择 - ,屏障调用可以在内部知道它应该引用的队列现在是主要的队列而不是concurrentPhotoQueue。对我来说听起来很合理。