首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在特定线程上锁定NSLock

如何在特定线程上锁定NSLock
EN

Stack Overflow用户
提问于 2013-04-11 15:00:02
回答 1查看 11K关注 0票数 6

我有一个属性@property NSLock *myLock

我想写两种方法:

代码语言:javascript
复制
- (void) lock

代码语言:javascript
复制
- (void) unlock

这些方法分别锁定和解锁myLock--它们需要这样做,而不管什么线程或队列调用它们。例如,线程A可能调用了lock,但是队列B可能是调用unlock的线程。这两种方法都应该正常工作,而不需要报告我试图从锁定它的不同线程/队列中解锁。此外,他们需要同步完成这一任务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-11 15:24:37

现在很少有NSLock是适合这项工作的工具。现在的工具要好得多,尤其是GCD,以后会更好。

您可能已经从the docs了解到了,但是我要重复下面的内容:

警告: NSLock类使用POSIX线程来实现其锁定行为。当向NSLock对象发送解锁消息时,必须确保消息是从发送初始锁定消息的同一线程发送的。从不同的线程解锁可能导致未定义的行为。

如果您试图在不同的线程上锁定和解锁,这很难在没有死锁的情况下实现。根本的问题是,如果lock阻塞了线程,那么后续的unlock就无法在该线程上运行,并且不能在另一个线程上运行unlockNSLock不适合这个问题。

NSLock不同,您可以使用dispatch_semaphore_create()实现相同的模式。它们可以安全地在您喜欢的任何线程上更新。您可以使用dispatch_semaphore_wait()进行锁定,也可以使用dispatch_semaphore_signal()进行解锁。尽管如此,这仍然不是正确的答案。

大多数资源争用最好是使用操作队列或调度队列来管理。这些方法提供了很好的方法来并行处理工作、管理资源、等待事件、实现生产者/消费者模式,以及在过去使用NSLockNSThread所做的几乎所有事情。我强烈建议使用Concurrency Programming Guide来介绍如何使用队列而不是锁进行设计。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15952190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档