可重入读/写锁定构造?

Ask*_*ble 16 multithreading locking objective-c ios

我是一名经验丰富的.NET程序员,并且在iOS上伸展自己的双腿.我在.NET中最喜欢的多线程构造之一是ReaderWriterLock.它允许多个读者或单个作者.我在iOS中真正缺少的一个功能是锁是可重入的.也就是说,读取器线程可以多次获取读锁定,只要它们释放相同的次数即可.同样,只要单个写入器线程以相同的数量释放锁定,它就可以多次获取锁定.

我查看了iOS框架,并没有任何构造似乎提供相同的支持,包括re-entrancy.我也查看了pthread库.我找到了rwlock,但它不允许重新入侵.

iOS上是否有允许重入读写锁的东西?

Rob*_*ier 18

是的,该@synchronized指令是可重入的.请参阅使用@Synchronized指令线程编程指南中,也线程在ObjC编程语言.

也就是说,你几乎不应该在iOS中使用它.在大多数情况下,您可以避免各种锁,更不用说像重入锁这样的重量级(慢)锁.有关iOS优先于手动线程管理和锁定的基于队列的方法的详细信息,请参阅"并发编程指南",特别是"从线程迁移"一节.

例如,读取器/写入器锁使用Grand Central Dispatch就是这样的:

- (id)init {
   ...
   _someObjectQueue = dispatch_queue_create("com.myapp.someObject", 
                                            DISPATCH_QUEUE_CONCURRENT);
 }

// In iOS 5 you need to release disptach_release(_someObjectQueue) in dealloc,
// but not in iOS 6.

- (id)someObject {
  __block id result;
  dispatch_sync(self.someObjectQueue, ^{
    result = _someObject;
  });
  return result;
}

- (void)setSomeObject:(id)newValue {
  dispatch_barrier_async(self.queue, ^{
    _someObject = newValue;
});
Run Code Online (Sandbox Code Playgroud)

这种方法允许使用独占编写器的无限并行读取器,同时确保编写器永远不会饿死并且写入和读取被序列化,同时避免任何内核调用,除非存在实际争用.这就是说它非常快速和简单.

当读者出现时,您将读取值的请求排队,并等待它处理.当编写器出现时,它会对阻止请求进行排队以更新它,这要求当前没有来自该队列的其他请求正在运行.使用此构造,开发人员无需管理任何锁定.只需按照您希望它们运行的​​顺序将事物放入队列中.


pep*_*psi 3

来自 iOS线程编程指南

系统仅支持使用 POSIX 线程的读写锁。有关如何使用这些锁的更多信息,请参阅pthread手册页。

所以我想如果pthreads不支持重入,答案是否定的。