GCD 为什么在我读取共享资源时使用 dispatch_sync
GCD why to use dispatch_sync when I read shared resource
我对阅读共享资源时使用 dispatch_sync
有一些疑问。
我在 Stack Overflow 上搜索了几个问题(例如:),但没有找到确切的答案。
我不明白为什么要使用
- (void)addPhoto:(Photo *)photo
{
if (photo) { // 1
dispatch_barrier_async(self.concurrentPhotoQueue, ^{ // 2
[_photosArray addObject:photo]; // 3
dispatch_async(dispatch_get_main_queue(), ^{ // 4
[self postContentAddedNotification];
});
});
}
}
- (NSArray *)photos
{
__block NSArray *array; // 1
dispatch_sync(self.concurrentPhotoQueue, ^{ // 2
array = [NSArray arrayWithArray:_photosArray];
});
return array;
}
知道为什么要用dispatch_barrier_async
,但是读_photosArray
的时候不知道为什么要用dispatch_sync,我猜是_photosArray
的写操作是在self.concurrentPhotoQueue
里,所以_photosArray
的读操作也需要在self.concurrentPhotoQueue
里,要不就用dispatch_sync
来实现多读?
读操作不使用dispatch_sync
会怎样?例如:
- (NSArray *)photos
{
__block NSArray *array;
array = [NSArray arrayWithArray:_photosArray];
return array;
}
非常感谢!
可能concurrentPhotoQueue
是串行队列。 concurrentPhotoQueue
主要是为了同步对photos
数组的访问。
由于它是串行的,因此来自该队列的所有访问都是串行的,如果您的应用中没有来自其他队列/线程的访问,则不会出现竞争条件。
写入访问可能是异步的,因为写入者通常不需要写入操作的结果。但是读取必须同步完成,因为调用者必须等待结果。如果您的 photos
方法将使用 dispatch_async
,它将在 之后将结果写入 array
photos
方法具有 return编辑。因此,photos
总是 return nil
.
您的 photos
的非同步版本可能会产生竞争条件:_photosArray
在复制其内容时可能会被修改,这样复制的项目数和数组的长度就会不同。这可能会导致 arrayWithArray:
.
内部崩溃
我对阅读共享资源时使用 dispatch_sync
有一些疑问。
我在 Stack Overflow 上搜索了几个问题(例如:
我不明白为什么要使用
- (void)addPhoto:(Photo *)photo
{
if (photo) { // 1
dispatch_barrier_async(self.concurrentPhotoQueue, ^{ // 2
[_photosArray addObject:photo]; // 3
dispatch_async(dispatch_get_main_queue(), ^{ // 4
[self postContentAddedNotification];
});
});
}
}
- (NSArray *)photos
{
__block NSArray *array; // 1
dispatch_sync(self.concurrentPhotoQueue, ^{ // 2
array = [NSArray arrayWithArray:_photosArray];
});
return array;
}
知道为什么要用dispatch_barrier_async
,但是读_photosArray
的时候不知道为什么要用dispatch_sync,我猜是_photosArray
的写操作是在self.concurrentPhotoQueue
里,所以_photosArray
的读操作也需要在self.concurrentPhotoQueue
里,要不就用dispatch_sync
来实现多读?
读操作不使用dispatch_sync
会怎样?例如:
- (NSArray *)photos
{
__block NSArray *array;
array = [NSArray arrayWithArray:_photosArray];
return array;
}
非常感谢!
可能concurrentPhotoQueue
是串行队列。 concurrentPhotoQueue
主要是为了同步对photos
数组的访问。
由于它是串行的,因此来自该队列的所有访问都是串行的,如果您的应用中没有来自其他队列/线程的访问,则不会出现竞争条件。
写入访问可能是异步的,因为写入者通常不需要写入操作的结果。但是读取必须同步完成,因为调用者必须等待结果。如果您的 photos
方法将使用 dispatch_async
,它将在 之后将结果写入 array
photos
方法具有 return编辑。因此,photos
总是 return nil
.
您的 photos
的非同步版本可能会产生竞争条件:_photosArray
在复制其内容时可能会被修改,这样复制的项目数和数组的长度就会不同。这可能会导致 arrayWithArray:
.