我对线程安全有问题。我有一个队列,当我修改内容时,该队列会导致线程之间的错误。我以前没用过锁,但我觉得我试过了。我在所有为队列操作后台NSMutableArray的代码周围添加了一个锁。问题是,我认为,我并没有对所有的人使用相同的锁。我在修改数组的每个方法中创建了一个新的NSLock实例。我假设我应该使用一个NSLock ivar来保护数组。但我的困惑来自这样一个事实,那就是一旦我加了它,它就起作用了。下面是一个样本。我假设,无论我在哪里创建了一个新的NSLock,我都应该使用一个ivar NSLock。我认为这段代码只是锁定了针对其他队列的队列和针对其他排程的去队列,而不是针对dequeues的队列。澄清就太好了。
@implmentation
...
- (void)enqueue:(id)obj
{
NSLock *arrayLock = [[NSLock alloc] init];
[arrayLock lock];
[_backingStore addObject:obj];
[arrayLock unlock];
}
- (id)dequeue
{
NSLock *arrayLock = [[NSLock alloc] init];
[arrayLock lock];
id result = [_backingStore firstObject];
if( result )
{
[_backingStore removeObjectAtIndex:0];
}
[arrayLock unlock];
return result;
}
...
@end发布于 2013-10-18 16:12:22
是的,您确实需要使用相同的NSLock实例来锁定对数组的两个访问。与这么多多线程错误一样,由于添加额外代码所造成的时间差异,问题似乎已经消失。或者,可能是你运气好,第二次考试时没有出现问题。
无论它的价值如何,NSLock只是锁定对Objective中关键部分的访问的一种方法。您还可以使用@synchronized(),从代码复杂性的角度来看,这可能更容易:
@synchronized(someSharedToken) {
// Do your array access here
}还可以使用串行分派队列来序列化对资源的访问。这有几个优点,尤其是能够在不等待当前线程完成工作的情况下将工作分派给它。将工作分派到队列中也比取出锁要便宜。请参阅苹果并发编程指南的创建串行调度队列部分。
https://stackoverflow.com/questions/19451510
复制相似问题