我正在争论是否要为多线程访问器迁移到基于 GCD 的模式。多年来,我一直在访问器中使用自定义的基于锁的同步,但我发现了一些信息(GCD 简介),并且似乎有基于 GCD 的方法的优点。我希望在这里开始对话,以帮助自己和其他人权衡决定。
模式看起来像:
- (id)something
{
__block id localSomething;
dispatch_sync(queue, ^{
localSomething = [something retain];
});
return [localSomething autorelease];
}
- (void)setSomething:(id)newSomething
{
dispatch_async(queue, ^{
if(newSomething != something)
{
[something release];
something = [newSomething retain];
[self updateSomethingCaches];
}
});
}
在专业方面:您可能会受益于非阻塞写访问;比锁更低的开销(也许?);从关键代码部分返回之前忘记解锁的安全性;其他的?
缺点:不存在异常处理,因此您必须将其编码到您可能需要它的每个块中。
这种模式是否可能是编写多线程访问器的推荐方法?
是否有为此目的创建调度队列的标准方法?换句话说,权衡粒度的最佳实践?例如,使用锁,锁定每个属性比锁定整个对象更精细。使用调度队列,我可以想象为所有对象创建一个队列会造成性能瓶颈,那么每个对象队列是否合适?显然,答案在很大程度上取决于具体的应用程序,但是否存在已知的性能权衡来帮助衡量该方法的可行性。
任何信息/见解将不胜感激。