重入读/写locking结构?

我是一名经验丰富的.NET程序员,用iOS来伸展我的双腿。 在.NET中我最喜欢的multithreading构造是ReaderWriterLock 。 它允许多个读者或一个作家。 我真的在iOS中缺less的一个特点是锁是可重入的。 也就是说, 读者线程只要释放相同的次数就可以多次获取读锁 。 同样,只要单个写入器线程释放locking数量相同,就可以多次获取locking。

我研究过iOS框架,并没有一个构造似乎提供了相同的支持,包括重入性。 我也看了一下pthread库。 我发现了rwlock,但是它不允许重新进入。

iOS上有什么允许重入读写锁的东西?

从iOS 线程编程指南 :

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

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

是的, @synchronized指令是可重入的。 请参阅在线程编程指南中使用@synchronized 指令 ,以及在ObjC编程语言中使用线程 。

这就是说,你应该几乎从不在iOS中使用这个。 在大多数情况下,你可以避免所有types的锁,更不用说像重入锁那样的重量级(慢)锁。 请参阅“并发编程指南”,特别是“从线程迁移”部分,了解iOS优于手动线程pipe理和locking的基于队列的方法的详细信息。

例如,使用Grand Central Dispatch的读/写locking就像这样工作:

 - (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; }); 

这种方法允许无限制的并行读取器和独占写入器,同时确保写入者不会饿死,并且写入和读取都是串行化的,除非存在实际的争用,否则将避免任何内核调用。 这就是说这是非常快速和简单。

当读者出现时,您排队请求读取值,并等待它处理。 当一个写者出现时,它会对一个屏障请求进行排队以更新它,这就要求当前没有来自该队列的其他请求正在运行。 有了这个构造,开发人员不需要pipe理任何锁。 只要按照您希望它们运行的​​顺序将事情放在队列中即可。