gpt4 book ai didi

ios - iOS-NSCache如何确保线程安全

转载 作者:行者123 更新时间:2023-12-01 15:58:59 35 4
gpt4 key购买 nike

我想实现一个线程安全的MutableDataContainer。当然,我可以简单地添加一个用于写入和读取操作的锁,但是在我的项目中,我需要经常读取数据,因此我不想使用这种方法。

有谁知道NSCache的实现方式?

最佳答案

我不能完全确定NSCache具体使用的锁定机制,但是我建议使用5种解决方案中的一种,尤其是在针对Apple平台的现代开发中,这可能是NSCache实现的方法之一。可能有5种以上,此列表并不详尽。我只是不包括更多内容,因为我认为Apple不会使用此处未包含的方法。

以下所有方法都可以使用,但我会尽量避免听起来好像对哪种方法更好有自己的见解(我们将看看效果如何),因为这并不是您真正要问的问题。另外,在这个问题上有很多意见,我不想为此大火。我将基于这些方法和我对Apple的看法,就如何实现NSCache提出自己的看法。

  • pthread库的pthread RW锁。这是专门为同步而设计的,并且具有锁所能提供的性能,而这与简单的互斥锁(RW锁实际上在使用)无关。对于读取,您可以使用pthread_rwlock_rdlock获得一个锁,对于写入,您可以使用pthread_rwlock_wrlock获得一个锁。在下面,这本质上是一个递归锁,并且除非有写操作,否则实际上不应该阻止读取。这优化了更常见的读取路径,并安全地说明了较不常见的写入路径。对于更不常见的读/写操作,必须从根本上将其升级为写操作。使用pthread锁(或互斥锁)时,您可以根据自己的代码逻辑和内部定义良好的条件来优化锁,尽管我在这里不做介绍。
  • GCD库的串行队列-使用串行队列时,将disaptch_sync用于读取,将dispatch_async用于写入。这与pthread RW锁在优化公用路径方面有所不同,因为读取和写入都是串行的。尽管它确实依赖GCD通过其底层队列优化来优化读取(例如,GCD确定何时针对dispatch_sync调用适本地进行阻止)。对于更不常见的读/写操作,您只需将其视为读并使用dispatch_sync即可。再说一次,因为这种方法与以前的方法有一个重要的区别,尽管读取应该通过GCD进行快速和优化,但它们仍然是串行的,从技术上讲仍然是相互阻塞的。
  • GCD库的并发队列-使用并发队列时,将dispatch_sync用于读取,将dispatch_barrier_async用于写入。对于特殊的读/写情况,有dispatch_barrier_sync专门用于此目的。在这个世界上,读取从不会相互阻塞,也不会阻塞,直到它们遇到障碍为止,该障碍是为写入和读取/写入保留的。这种方法还依赖于GCD来优化读取,但是通过使用并发队列,您选择不进行串行读取。因此,基本上由您来控制必须是串行的事物,并在需要这些操作时使用屏障。
  • Foundation框架的NSLock-这是Foundation框架的经典构造。尽管它的原始实现可能有所不同,但是最近我研究了它的内部构造,并且在我测试过的所有情况下,它本质上都是围绕相应pthread实现的Objective-C包装。
  • Objective-C的@synchronized()-这是内置的Objective-C函数/关键字,提供锁定和异常处理。实际上,它的下面是一个带有异常处理程序的NSLock。使用它时,它既适用于读取,也适用于写入。在内部,它们被相同地对待,因此没有一个相对于另一个进行优化。您的锁与您传递给@synchronized(obj)函数的对象相关联。因此,从本质上讲,无论在相应的``@synchronized(){}''块中如何使用或更改对象,您都将锁定对该对象的访问。

  • 每种方法都有更多详细信息和警告,不过,如果我是一个博彩公司(但我不是),并且基于此之后我要考虑的几件事,我会说苹果公司正在将方法3用于NSCache 。

    原因1:苹果公司担心性能,特别是在Foundation中。自GCD成立以来,他们已经在GCD上投入了大量资金,并将继续对其进行投资。创建GCD的大多数原因是基于在不牺牲性能的情况下尽可能多地删除样板。我想说的是,Apple可能在Foundation内部的一些地方对他们的建议进行了 mock ,而NSCache可能就是其中之一。

    原因2:有点像“原因1继续”,最近有证据表明苹果公司对GCD进行了投资,而对 @synchonized()却缺乏投资,这可以在Swift中看到。 GCD是Swift中同步的首选方法。

    关于ios - iOS-NSCache如何确保线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32441134/

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