NSObject的retain方法是原子操作吗?

12

NSObject的retain方法是原子操作吗?

比如说,当在两个不同的线程中保留同一个对象时,是否可以保证该对象的引用计数会增加两次?还是可能只会增加一次?

谢谢。

1个回答

14

NSObject 以及对象分配和保留计数函数都是线程安全的 — 请参阅附录A:线程安全摘要,位于线程编程指南中。


编辑:我决定看一下Core Foundation的开源部分。在CFRuntime.c中,__CFDoExternRefOperation()是负责更新保留计数器的函数。它会测试进程是否有多个线程,如果有多个线程,则在更新保留计数之前获取自旋锁,从而使此操作线程安全。

有趣的是,保留计数不是struct(类)意义上对象的属性(或实例变量)。运行时保留一个单独的带有保留计数器的结构。事实上,如果我理解正确,这个结构是哈希表数组,每个哈希表都有一个自旋锁。这意味着锁引用了被放置在同一个哈希表中的多个对象,即锁既不是全局的(适用于所有实例),也不是每个实例的。


7
没错。它使用一种叫做“锁分离”的策略来减少全局保留锁的争用。但是这仍然相当慢,所以如果您有一个对象的引用计数变化非常频繁,那么实现自定义的引用计数系统可能是值得的。这并不特别难(使用OSAtomicIncrement()和相关方法),但您将失去在Instruments中检查这些对象引用计数历史记录的能力。 - Catfish_Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接