gpt4 book ai didi

objective-c - 多线程 Objective-C 访问器 : GCD vs locks

转载 作者:太空狗 更新时间:2023-10-30 03:32:41 24 4
gpt4 key购买 nike

我正在考虑是否要为多线程访问器迁移到基于 GCD 的模式。多年来,我一直在访问器中使用自定义的基于锁的同步,但我发现了一些信息 ( Intro to 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];
}
});
}

从好的方面来说:您可能会受益于非阻塞写访问;比锁更低的开销(也许?);在从关键代码部分返回之前忘记解锁的安全性;其他人呢?

缺点:不存在异常处理,因此您必须将其编码到您可能需要它的每个 block 中。

这种模式可能是编写多线程访问器的推荐方法吗?

是否有为此目的创建调度队列的标准方法?换句话说,权衡粒度的最佳实践?例如,对于锁,锁定每个属性比锁定整个对象更细粒度。使用调度队列,我可以想象为所有对象创建单个队列会造成性能瓶颈,那么每个对象队列是否合适?显然,答案在很大程度上取决于具体的应用程序,但是否存在已知的性能权衡来帮助衡量该方法的可行性。

如有任何信息/见解,我们将不胜感激。

最佳答案

Is this pattern potentially the recommended method of writing multithreaded accessors?

我猜你是在考虑串行队列的情况下写的,但没有理由这样做。考虑一下:

dispatch_queue_t queue = dispatch_queue_create("com.example", DISPATCH_QUEUE_CONCURRENT);

// same thing as your example
- (NSString*)something {
__block NSString *localSomething;
dispatch_sync(queue, ^{
localSomething = _something;
});
return localSomething;
}

- (void)setSomething:(NSString*)something {
dispatch_barrier_async(queue, ^{
_something = something;
});
}

它并发读取,但在写入发生时使用调度屏障禁用并发。 GCD 的一大优势是允许并发读取,而不是像 @property (atomic) 那样锁定整个对象。

从客户端的角度来看,两种异步(dispatch_async、dispatch_barrier_async)都更快,但执行起来比同步慢,因为它们必须复制 block ,而且 block 任务这么小,复制所需的时间变得有意义。我宁愿让客户快速返回,所以我同意。

关于objective-c - 多线程 Objective-C 访问器 : GCD vs locks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15857581/

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