- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个属性@property NSLock *myLock
我想写两个方法:
- (void) lock
和
- (void) unlock
这些方法分别锁定和解锁myLock
并且无论调用它们的线程或队列如何,它们都需要这样做。例如,线程 A 可能调用了 lock
,但队列 B 可能调用了 unlock
。这两种方法都应该正常工作,而不会报告我正在尝试从锁定它的不同线程/队列解锁锁。此外,他们需要同步执行此操作。
最佳答案
很少有 NSLock
是完成这项工作的正确工具。现在有更好的工具,尤其是 GCD;稍后再说。
您可能已经从 the docs 了解到,但我会为那些正在阅读的人重复一遍:
Warning: The NSLock class uses POSIX threads to implement its locking behavior. When sending an unlock message to an NSLock object, you must be sure that message is sent from the same thread that sent the initial lock message. Unlocking a lock from a different thread can result in undefined behavior.
如果您尝试在不同的线程上锁定和解锁,那么在没有死锁的情况下很难实现。根本的问题是,如果 lock
阻塞了线程,那么后续的 unlock
将无法在该线程上运行,您也无法 unlock
在不同的线程上。 NSLock
不适用于这个问题。
除了 NSLock
,您还可以使用 dispatch_semaphore_create()
实现相同的模式。这些可以在您喜欢的任何线程上安全地更新。您可以使用 dispatch_semaphore_wait()
锁定,也可以使用 dispatch_semaphore_signal()
解锁。也就是说,这个仍然通常不是正确答案。
大多数资源争用最好用操作队列或调度队列来管理。这些提供了极好的方法来并行处理工作、管理资源、等待事件、实现生产者/消费者模式,以及以其他方式完成您使用 NSLock
或 NSThread
过去。我强烈推荐 Concurrency Programming Guide作为对如何使用队列而不是锁进行设计的介绍。
关于ios - 如何在特定线程上锁定 NSLock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15952190/
我是一名优秀的程序员,十分优秀!