首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有正确使用NSLock,但似乎仍然有效

没有正确使用NSLock,但似乎仍然有效
EN

Stack Overflow用户
提问于 2013-10-18 13:57:11
回答 1查看 5.1K关注 0票数 3

我对线程安全有问题。我有一个队列,当我修改内容时,该队列会导致线程之间的错误。我以前没用过锁,但我觉得我试过了。我在所有为队列操作后台NSMutableArray的代码周围添加了一个锁。问题是,我认为,我并没有对所有的人使用相同的锁。我在修改数组的每个方法中创建了一个新的NSLock实例。我假设我应该使用一个NSLock ivar来保护数组。但我的困惑来自这样一个事实,那就是一旦我加了它,它就起作用了。下面是一个样本。我假设,无论我在哪里创建了一个新的NSLock,我都应该使用一个ivar NSLock。我认为这段代码只是锁定了针对其他队列的队列和针对其他排程的去队列,而不是针对dequeues的队列。澄清就太好了。

代码语言:javascript
复制
@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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-18 16:12:22

是的,您确实需要使用相同的NSLock实例来锁定对数组的两个访问。与这么多多线程错误一样,由于添加额外代码所造成的时间差异,问题似乎已经消失。或者,可能是你运气好,第二次考试时没有出现问题。

无论它的价值如何,NSLock只是锁定对Objective中关键部分的访问的一种方法。您还可以使用@synchronized(),从代码复杂性的角度来看,这可能更容易:

代码语言:javascript
复制
@synchronized(someSharedToken) {
    // Do your array access here
}

还可以使用串行分派队列来序列化对资源的访问。这有几个优点,尤其是能够在不等待当前线程完成工作的情况下将工作分派给它。将工作分派到队列中也比取出锁要便宜。请参阅苹果并发编程指南的创建串行调度队列部分。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19451510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档