Nos*_*tap 6 multithreading objective-c grand-central-dispatch nslock ios
我有一个房产 @property NSLock *myLock
我想写两种方法:
- (void) lock
Run Code Online (Sandbox Code Playgroud)
和
- (void) unlock
Run Code Online (Sandbox Code Playgroud)
这些方法myLock分别锁定和解锁,无论调用什么线程或队列,它们都需要这样做.例如,线程A可能已经调用,lock但队列B可能是一个调用unlock.这两种方法都应该正常工作,而不报告我试图从锁定它的其他线程/队列中解锁锁.此外,他们需要同步执行此操作.
Rob*_*ier 26
很少有人能够NSLock胜任这项工作.现在有更好的工具,尤其是GCD; 更晚些时候.
正如您可能已经从文档中了解到的那样,但我会重复阅读以下内容:
警告:NSLock类使用POSIX线程来实现其锁定行为.向NSLock对象发送解锁消息时,必须确保从发送初始锁定消息的同一线程发送消息.从其他线程解锁锁定可能导致未定义的行为.
如果你试图在不同的线程上锁定和解锁,那么在没有死锁的情况下很难实现.根本问题在于,如果lock阻塞线程,那么后续unlock就无法unlock在该线程上运行,并且您无法在不同的线程上运行.NSLock不是为了这个问题.
而不是NSLock,你可以实现相同的模式dispatch_semaphore_create().这些可以在您喜欢的任何线程上安全地更新.你可以锁定使用dispatch_semaphore_wait(),你可以解锁使用dispatch_semaphore_signal().尽管如此,这还是通常是不正确的答案.
大多数资源争用最好使用操作队列或调度队列进行管理.这些提供了并行处理工作,管理资源,等待事件,实现生产者/消费者模式以及以其他方式完成您过去NSLock或NSThread过去所做的几乎所有事情的出色方法.我强烈推荐并发编程指南作为如何使用队列而不是锁设计的介绍.