【发布时间】:2016-07-27 02:46:10
【问题描述】:
我声明了一个原子 NSMutableArray 来保存对象
@property (atomic, strong) NSMutableArray *list;
@synthesize list;
然后我使用线程来保存对象,例如:
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ // writing files into the disk in background
// do something..
[weakSelf.list addObject:object]; // add object at the end of the list
if (!weakSelf.threadCreateFlag) {
NSInvocationOperation *newoperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(createThreadMethod) object:nil]; // create thread to remove from the array
[weakSelf.serailQueue addOperation:newoperation];
}
});
我正在尝试读取索引 0 处的对象并将其从数组中删除
- (void)createThreadMethod {
self.threadCreateFlag = YES;
do {
NSLog(@"loop");
@autoreleasepool {
NSDictionary *object = (NSDictionary *)[self.list objectAtIndex:0];
[self.list removeObjectAtIndex:0];
// doing something...
}
} while(self.list.count > 0);
self.photoSavingLock = NO;
}
我遇到了一个问题 - 有时,数组包含对象 0x0,我的应用程序会崩溃。
我对此进行了一些研究,我认为是因为removeObjectAtIndex 不是线程安全的。所以我试图在读取/删除和添加功能周围添加一个全局@property (atomic, strong) NSLock *lock。
但是这次我得到了[NSLock deadlock]。
使这个场景线程安全的正确方法是什么?
【问题讨论】:
-
我主张使用私有并发队列来同步读取和写入数组,使用
dispatch_barrier_async执行写入和dispatch_sync执行读取。但是@synchronized也是一种很好且方便的方法,尽管有一小部分额外开销。见stackoverflow.com/questions/17599401/… -
@synchronized是路径作为atomic属性的遗物。现在没有人使用它们。您应该使用串行队列来访问您的列表。
标签: ios objective-c multithreading nsmutablearray