gpt4 book ai didi

objective-c - 没有正确使用 NSLock,但似乎仍然有效

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:11 25 4
gpt4 key购买 nike

我遇到了线程安全问题。我有一个队列,当我修改内容时导致跨线程错误。我以前没用过锁,但我想试试。我在为我的队列操作支持 NSMutableArray 的所有代码周围添加了一个锁。我认为,问题是我没有对所有这些都使用相同的锁。我在每个修改数组的方法中创建了一个新的 NSLock 实例。我假设我应该使用一个 NSLock ivar 来保护数组。但我的困惑来自于我添加它后它就起作用了。下面是一个示例。我假设在我创建新 NSLock 的任何地方,我都应该只使用一个 ivar NSLock。我认为这段代码只是针对其他入队锁定入队,针对其他出队锁定出队,而不是针对出队锁定入队。澄清会很好。

@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

最佳答案

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

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

@synchronized(someSharedToken) {
// Do your array access here
}

您还可以使用串行调度队列来串行化对资源的访问。这有几个优点,其中最重要的是能够在不等待当前线程完成该工作的情况下向其分派(dispatch)工作。将工作分派(dispatch)到队列也比取出锁更便宜。查看Creating Serial Dispatch Queues Apple 的并发编程指南部分。

关于objective-c - 没有正确使用 NSLock,但似乎仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19451510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com