gpt4 book ai didi

ios - 如何在特定线程上锁定 NSLock

转载 作者:可可西里 更新时间:2023-11-01 03:35:58 24 4
gpt4 key购买 nike

我有一个属性@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() 解锁。也就是说,这个仍然通常不是正确答案。

大多数资源争用最好用操作队列或调度队列来管理。这些提供了极好的方法来并行处理工作、管理资源、等待事件、实现生产者/消费者模式,以及以其他方式完成您使用 NSLockNSThread 过去。我强烈推荐 Concurrency Programming Guide作为对如何使用队列而不是锁进行设计的介绍。

关于ios - 如何在特定线程上锁定 NSLock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15952190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com