问题标签 [nslock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
549 浏览

ios - NSLock,等待的线程数

我正在开发一个 iOS 应用程序,需要为我需要知道有多少线程正在等待锁定同一个 NSLock 对象的问题实施解决方案。

在 Java 中,我有类 ReentrantLock,方法是 getQueueLength,它“返回等待获取此锁的线程数的估计值”。

Objective-C中有类似的东西吗?我试图找到一些东西,但什么也没有。我应该继承 NSLock 来自己实现这个机制吗?

0 投票
2 回答
549 浏览

ios - 如何在iOS中使特定部分功能等待

我正在尝试执行共享操作,在该操作中我使用异步块调用函数,但在我的下一个 if 语句中,我需要获取在块中完成的值才能继续。这是我的代码,它将突出显示更多细节。我听说过 NSLock 并尝试使用它,但它没有用,可能是我在做一些锁,我对锁不太熟悉。

0 投票
1 回答
719 浏览

ios - 使用 NSConditionLock 冻结 iOS 应用

我遇到了这个奇怪的问题,应用程序在某个时候冻结。我猜它与我的使用方式有关NSConditionLock

我已经使用了一个库,它由一系列调查问题组成,但它的工作方式是直接跑到最后一个问题而不接受答案,因此需要暂停线程并接受来自用户。

我以前没有使用过它,所以如果我错误地实施它,也许有人可以提供帮助?如果提供的代码不足,请告诉我。

编辑:简而言之,我想要这个 java 片段的 Objc 等价物......

编辑 2:应 Paul 的要求 ShowUI 方法。

0 投票
1 回答
118 浏览

ios - 多线程数据访问问题,@synchronized 和串行队列

您可能已经体验过,访问非线程安全变量是一件令人头疼的事情。一种简单的iOS解决方案是使用关键字 @synchronized,这将增加NSLock以确保数据可以被唯一的一个线程访问,缺点如下:

  1. 锁太多会大大降低应用程序的性能,尤其是在被主线程调用时。

  2. 当逻辑变得复杂时,就会发生死锁。

基于以上考虑,我们更倾向于使用串行队列来处理,每个线程安全的关键操作都会追加到队列的末尾,这是一个很好的解决方案,但问题是所有的访问接口都应该设计成异步风格,见下一篇。

调用这个类的人并不愿意以这种方式进行设计。有这方面经验的朋友请一起分享和讨论。

0 投票
3 回答
376 浏览

objective-c - 使用 NSLocks 作为原子或非原子属性?

我应该将 NSLock 声明为原子的,还是只是浪费时间并且锁本身应该是非原子的?

0 投票
1 回答
186 浏览

ios - ios基于密钥创建写锁

我知道使用dispatch_barrier_async来锁定给定资源,但在我的情况下,它不是一个好的候选者,因为我没有修改共享数据结构,而是磁盘上的资源并且不想阻塞整个队列,而只是一个给定密钥,因为该操作可能需要很长时间。我不确定文件系统如何从多个线程同时访问同一个文件(按名称),并且在文档中找不到明确的答案,只是最佳实践。我想我想通过“文件名”锁定 - 并且缺少一个方法“ tryLock(key)

就像是:

编辑:

这样做@synchronized吗?这是一个合适的用例吗?

0 投票
1 回答
254 浏览

ios - 当所有代码都在主线程上时如何优雅地锁定(寻找NSLock的替代品)

我有一种情况,我必须等待 UIKit 动画完成,并且我正在使用完成块来执行相关的最终代码。现在我意识到当我从主线程调用该函数两次时,我可以触发一个引入错误的竞争条件。我无法使用简单的@synchronised(self) 锁,但我使用 NSLock 有不同的解决方法。我想知道是否有更优雅的解决方案。

为了给出使用它的一些上下文,我通过 UIAttachmentBehaviour (UIKit Dynamics) 将许多视图相互连接,以进行一些物理动画。当我滑动视图时,它被替换并且动画看起来像视图正在滑入/滑出(简单翻译)。在我的解决方案中,我删除了附件行为,否则物理附件将跟随滑动视图,这不是我想要的。

有问题的代码如下所示:

请注意,手动触发问题很困难,但如果您以编程方式调用代码片段,则执行顺序会略有不同。为了给出一个想法,我用 A、B、C、D 标记了代码部分。让我们调用第一个执行行 1A...1D 和第二个调用 2A...2D 的跟踪。在正常情况下,所需的执行顺序类似于:

但是,当以编程方式调用 handleGesture 两次时,执行顺序是:

我想出的解决方法如下所示:

注意,如果你调用 lock 而不是 tryLock,那么你最终会陷入死锁,因为代码是在主线程上执行的,如果它阻塞了动画将永远不会完成。

换句话说,当handleGesture 被调用时,它会被锁定直到动画结束。如果在完成块之间或之后再次调用该函数,它会尝试获取锁。如果它无法获取它,它会在 0.5 秒后再次尝试(大约是动画应该花费的时间)。

现在我觉得这可能会成为餐饮哲学家的问题,这让我想知道是否没有更简单的解决方案。我认为在函数开头放置一个@synchronised(self) 可以解决问题,但是当动画操作被推送到主线程时,函数立即返回并且锁将立即释放。

感谢您到目前为止的阅读。

0 投票
1 回答
51 浏览

ios - 我的程序执行不正常,我假设是因为一些线程在另一个之前完成。NSLock,GDC,建议?

从编程的角度来看,由于代码的编写方式,我不一定能解决这个问题。

基本上,在伪代码中:

基本上,条件检查发生在 setFlag 完成之前,因此在检查时它永远不会为真。即使我沿着 didSetFlagFinishExecuting 的行添加第二个全局布尔值,我也会遇到同样的问题——条件发生在其他问题之前。我把它放在一个while循环中,但由于我编码的方式,它被困在一个无限循环中。我没有线程锁/ GCD 的经验。我宁愿不使用它,但如果必须,我会使用它。有什么建议么?

编辑:实际代码

// 在 vi​​ewDidLoad 中

// 作为 ViewController 的扩展

因此,如果我在这里最后打印 Global.loggedIn,那将是真的。只是这些都没有及时完成。即使我将其设为返回函数,无论出于何种原因,viewDidLoad 中的条件都会将其读取为 false,然后将打印“hello”。

0 投票
4 回答
69 浏览

ios - 即使锁定后线程崩溃 <__NSArrayM: 0x7f881a6b1900> 在枚举时发生了变异?

这是我的代码,我正在根据我的情况删除多个值

我知道试图找出这个错误时出了点问题,请帮助我克服这个问题。

这是错误:

0 投票
2 回答
2246 浏览

swift - Swift:理解 NSLock 死锁

使用以下命令在我们的日志中看到此消息NSLock

这是否意味着应用程序遇到了致命错误并将停止工作?或者这是以某种“优雅”的方式处理的?