iphone - NSLock 实例应该是 "global"吗?

标签 iphone core-data multithreading locking nslock

我应该做一个NSLock应用程序委托(delegate)中的实例,供所有类使用?还是建议让每个类实例化自己的NSLock根据需要实例?

例如,如果我可以访问分布在两个 View Controller 中的托管对象上下文,那么锁定在第二种情况下是否有效?

最佳答案

如果多个对象访问您的对象只是为了读取其内容,那么您根本不需要锁。如果至少有一个对象访问您的对象以写入/更新其内容,那么其他对象是否访问您的对象以读取或写入/更新它并不重要:在这种情况下,您需要一个锁。

现在,为了正确保护您的对象(在代码的关键部分,多个对象可以访问它),您必须使用相同的锁定实例,然后必须由所有可能访问您愿意保护的对象的对象共享.

如果您的应用程序需要保护大多数类可能同时访问的对象,那么拥有一个锁实例就可以了。如果您想要更好的性能(特别是如果同时访问您的对象的数量很高),那么您可以拥有多个锁。每个锁将负责允许/拒绝访问对象的特定属性/字段。这样,多个对象可以访问您的对象同时更改不同的属性/字段。您基本上是在增加对象上的并发操作数。但是,每个锁必须仍然在将访问您正在保护的对象的其他对象之间共享。

每个 Controller 都有一个锁实例根本行不通;这不会保护您的对象免受来自不同线程中其他对象的并发访问。 NSLock 是使用 POSIX pthread 互斥锁实现的,因此必须以完全相同的方式使用它。这在 NSLock 文档中也有明确说明:

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

因此,为了保留临界区语义,获得锁的同一线程负责在完成时释放它。另请注意,锁定机制仅适用于快速操作,即您应该在释放之前仅在短时间内获取锁定。如果您需要等待不可预测的时间,那么您需要一种不同的同步机制,即通过 NSCondition 类可用的条件变量。

希望这可以帮助。

关于iphone - NSLock 实例应该是 "global"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1582574/

相关文章:

ios - 如何解决此Mach-O Linker问题?

iphone - NSURLRequest 超时 IOS

iphone - 在iPhone中拖放按钮

ios - NSFetchedResultsController 加载整个数据和糟糕的性能

android - 有很多 HandlerThreads 活着,什么也不做,只是等待,这不好吗?

Java自动识别线程死锁并停止执行?

iphone - 在 iPhone 中查找 IP 地址

ios - 模型文件的目的是什么?

ios - iOS/Objective-C:核心数据提取中的NSPredicate和NULL值

c++:异步抛出 C2752 和 C2064