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)
这种方法允许使用独占编写器的无限并行读取器,同时确保编写器永远不会饿死并且写入和读取被序列化,同时避免任何内核调用,除非存在实际争用.这就是说它非常快速和简单.
当读者出现时,您将读取值的请求排队,并等待它处理.当编写器出现时,它会对阻止请求进行排队以更新它,这要求当前没有来自该队列的其他请求正在运行.使用此构造,开发人员无需管理任何锁定.只需按照您希望它们运行的顺序将事物放入队列中.
| 归档时间: |
|
| 查看次数: |
3289 次 |
| 最近记录: |