我有一个属性@property NSLock *myLock
我想写两种方法:
- (void) lock和
- (void) unlock这些方法分别锁定和解锁myLock、和--它们需要这样做,而不管什么线程或队列调用它们。例如,线程A可能调用了lock,但是队列B可能是调用unlock的线程。这两种方法都应该正常工作,而不需要报告我试图从锁定它的不同线程/队列中解锁。此外,他们需要同步完成这一任务。
发布于 2013-04-11 15:24:37
现在很少有NSLock是适合这项工作的工具。现在的工具要好得多,尤其是GCD,以后会更好。
您可能已经从the docs了解到了,但是我要重复下面的内容:
警告: NSLock类使用POSIX线程来实现其锁定行为。当向NSLock对象发送解锁消息时,必须确保消息是从发送初始锁定消息的同一线程发送的。从不同的线程解锁可能导致未定义的行为。
如果您试图在不同的线程上锁定和解锁,这很难在没有死锁的情况下实现。根本的问题是,如果lock阻塞了线程,那么后续的unlock就无法在该线程上运行,并且不能在另一个线程上运行unlock。NSLock不适合这个问题。
与NSLock不同,您可以使用dispatch_semaphore_create()实现相同的模式。它们可以安全地在您喜欢的任何线程上更新。您可以使用dispatch_semaphore_wait()进行锁定,也可以使用dispatch_semaphore_signal()进行解锁。尽管如此,这仍然不是正确的答案。
大多数资源争用最好是使用操作队列或调度队列来管理。这些方法提供了很好的方法来并行处理工作、管理资源、等待事件、实现生产者/消费者模式,以及在过去使用NSLock或NSThread所做的几乎所有事情。我强烈建议使用Concurrency Programming Guide来介绍如何使用队列而不是锁进行设计。
https://stackoverflow.com/questions/15952190
复制相似问题