- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我应该做一个NSLock
应用程序委托(delegate)中的实例,供所有类使用?还是建议让每个类实例化自己的NSLock
根据需要实例?
例如,如果我可以访问分布在两个 View Controller 中的托管对象上下文,那么锁定在第二种情况下是否有效?
最佳答案
如果多个对象访问您的对象只是为了读取其内容,那么您根本不需要锁。如果至少有一个对象访问您的对象以写入/更新其内容,那么其他对象是否访问您的对象以读取或写入/更新它并不重要:在这种情况下,您需要一个锁。
现在,为了正确保护您的对象(在代码的关键部分,多个对象可以访问它),您必须使用相同的锁定实例,然后必须由所有可能访问您愿意保护的对象的对象共享.
如果您的应用程序需要保护大多数类可能同时访问的对象,那么拥有一个锁实例就可以了。如果您想要更好的性能(特别是如果同时访问您的对象的数量很高),那么您可以拥有多个锁。每个锁将负责允许/拒绝访问对象的特定属性/字段。这样,多个对象可以访问您的对象同时更改不同的属性/字段。您基本上是在增加对象上的并发操作数。但是,每个锁必须仍然在将访问您正在保护的对象的其他对象之间共享。
每个 Controller 都有一个锁实例根本行不通;这不会保护您的对象免受来自不同线程中其他对象的并发访问。 NSLock 是使用 POSIX pthread 互斥锁实现的,因此必须以完全相同的方式使用它。这在 NSLock 文档中也有明确说明:
警告: NSLock 类使用 POSIX 线程来实现其锁定行为。向 NSLock 对象发送解锁消息时,您必须确保该消息是从发送初始锁定消息的同一线程发送的。从不同的线程解锁锁可能会导致未定义的行为。
因此,为了保留临界区语义,获得锁的同一线程负责在完成时释放它。另请注意,锁定机制仅适用于快速操作,即您应该在释放之前仅在短时间内获取锁定。如果您需要等待不可预测的时间,那么您需要一种不同的同步机制,即通过 NSCondition 类可用的条件变量。
希望这可以帮助。
关于iphone - NSLock 实例应该是 "global"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1582574/
我需要在发出异步请求之前设置一个互斥锁,然后在另一个线程上的这个请求的回调中解锁互斥锁。 苹果文档说: Warning: The NSLock class uses POSIX threads to
我有一个以 a 开头的循环 [lock lock]; 因为在循环体中我正在创建另一个线程,该线程需要在循环再次运行之前完成。 (完成后另一个线程将解锁它)。 但是在第二个循环中我收到以下错误: 201
我有一个属性@property NSLock *myLock 我想写两个方法: - (void) lock 和 - (void) unlock 这些方法分别锁定和解锁myLock并且无论调用它们的线程
我有一个全局变量,可以从多个线程访问,包括从主线程访问。我想使用 NSLock because it’s faster than GCD . 这是我正在尝试做的事情: struct Synchroni
使用 NSLock 在我们的日志中看到这条消息: *** -[NSLock lock]: deadlock ( '(null)') *** Break on _NSLockError() to deb
我正在审查一些 Alamofire sample重试代码: func should(_ manager: SessionManager, retry request: Request, with
我目前有一组异步函数,它们都在 viewDidLoad() 中调用。每个函数的末尾都有一个 bool 值,在函数完成时将其从 false 设置为 true。还有一个条件语句检查触发第三个函数的两个函数
我正在处理多线程代码。数据访问通过“NSLock”对象锁定在多个部分。我想确保在这些部分中调用的某些方法会检查是否获得了适当的锁。 类似于: assert([myLock isSet] == YES)
我应该做一个NSLock应用程序委托(delegate)中的实例,供所有类使用?还是建议让每个类实例化自己的NSLock根据需要实例? 例如,如果我可以访问分布在两个 View Controller
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 2 年前。 Improv
在这种情况下,我必须等待 UIKit 动画完成,并且我正在使用完成 block 来执行相关的最终代码。现在我已经意识到,当我从主线程调用该函数两次时,我可以触发一个引入错误的竞争条件。我无法使用简单的
我正在编写代码来渲染和旋转一张图片,其细节正在同时计算和更新。它在单个线程(带有显示链接)上无错误地工作,但看起来很笨重,而且我不希望显示链接触发计算。所以我想在主线程(带有显示链接)中执行所有与 O
我遇到了线程安全问题。我有一个队列,当我修改内容时导致跨线程错误。我以前没用过锁,但我想试试。我在为我的队列操作支持 NSMutableArray 的所有代码周围添加了一个锁。我认为,问题是我没有对所
我有一段代码经常被主线程或其他几个后台线程访问。我需要确保一次只处理一个代码。 我目前正在使用 @synchronized(self) { } block ,但我不确定它是否提供了正确的保护。它与 N
我一直在使用 NSLock 来同步敏感的代码部分,但一直遇到问题,因为它们必须从锁定它们的同一线程解锁。然后我发现 GCD 的 DispatchSemaphore 似乎在做同样的事情,而且更方便的是它
从编程的角度来看,由于代码的编写方式,我不一定能解决这个问题。 基本上,用伪代码表示: if NSUserDefaults' stored token exists{ setFlag(toke
谁能简要说明这 3 个系统在线程安全方面的优缺点? 通过观看最近的 WWDC 视频,我感觉到 Apple 正在插入 GCD 的使用,以创建线程安全的高性能读写器。 这背后的想法/支持是什么?是时候访问
我阅读了有关 GCD 队列的 Apple 文档,开始想知道如果我让修改类型为 NSMutableArray 的实例成员在串行队列中不是线程安全的,会发生什么情况?串行队列会保证我串行执行操作,但我仍然
我是 Objective-C 的新手。如果我有一个类属性可能会在 API 调用等异步事件期间被修改,那么确保在其他人访问属性时更改属性的最佳方法是什么线程不会导致崩溃? 据我所知,我有两个选择: 1)
我有一些 Objective-C 代码,它使用 NSLock 来实现某种事务。该对象在“开始事务”上被锁定,在锁定到位的情况下进行了几次其他调用,然后通过“提交”将其释放。我正在编写一个 JNI 粘合
我是一名优秀的程序员,十分优秀!