问题标签 [nscondition]

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 投票
1 回答
765 浏览

ios - 当有两个不同的地方发出信号并等待时如何使用 NSCondition

这是我在方法中的伪代码:

问题是当第一个事件 2 发生然后事件 1 时,我从 iOS(见上文)收到“未锁定时解锁”警告。

现在让我解释一下我要完成的工作:这是数据获取器的一部分。接收到正常情况数据并执行 block1:没有问题。有时,无数据块 2 会首先被虚假执行,紧接着是块 1;这是我收到NSCondition警告的时候。为了抓住这种罕见的情况,我等了2.0几秒钟。这是发生的事情:

  • Block2 发出条件信号。
  • Lock-1 落空。
  • predicate不再是0所以没有等待。
  • 条件再次解锁。
  • 然后我们继续到if条件(predicate == 2)为真的-语句。
  • 该方法立即获得 Lock-2。<<<< 根本原因
  • 随后该方法等待2.0几秒钟。
  • 在这 2 秒内 block1 被执行并发出条件信号。
  • 然后 block1 解锁条件和方法也解锁。

根本原因(见上文)是锁是由方法(工作者/消费者)获取的,而它应该是由数据生产者获取的。我花了很多时间试图弄清楚这一点。我的一个想法是使用两个NSConditions,但我无法弄清楚这一点,因为事情是相互交织的。

注意:我觉得奇怪的是警告没有出现在-statementunlock内部。if

谢谢你的时间!

0 投票
0 回答
325 浏览

ios - 调用后台方法iOS时显示错误[NSConditionLock lockWhenCondition:beforeDate:]

当我在后台运行多个方法时,我的应用程序有时会显示以下错误。它说它无法执行后台方法。

为什么我的应用会出现此错误?我该如何解决这个问题?

0 投票
0 回答
93 浏览

ios - NSCondition 被无效线程锁定

我正在尝试创建一个多线程过渡动画系统,但对我用于同步的 NSCondition 对象中看似损坏的状态感到困惑。我在下面的调试器中添加了一些行来说明正在发生的事情:

-lock令我困惑的是 condvar 的描述给出的地址和名称,因为它们与调用条件的 NSThread 的名称和地址不匹配。此外,检查 NSCondition 本身的实际内容也无济于事,因为它的_priv指针为 nil。有没有人有这方面的经验或知道如何解决?

PS 在人们建议我只使用 GCD 进行并发之前:我正在为我的动画使用 CADisplayLinks,所以我需要使用 NSThreads,因为 CADisplayLinks 需要一个 NSRunLoop 来触发更新。

0 投票
1 回答
341 浏览

ios - 核心数据并发:避免在两个不同的地方写入

在登录私有上下文后(以避免主线程阻塞),我正在做一些繁重的核心数据插入工作(比如 A )。在这完成之前,不幸的是在代码中的某个地方还有一个插入工作(比如 B)(不是很重),但它是必不可少的,并且还使用私有上下文来保存。

问题:在将记录保存在任何地方时,我检查它们是否已经在数据库中(以确保唯一的记录),但是在完成上述任务并检查 coredata 后,我发现一些记录重复,这仅仅是因为在我打电话之前在任务 A 处“保存”,另一个进程 B 已经写入了重复记录。

我正在寻找解决方案,可以预见两种选择:

  1. 让第二个任务等待第一个任务(在另一个线程中调度并等待直到完成)
  2. 请推荐!!

编辑: 事实证明,问题更多地与合并而不是并发有关,合并创建重复记录,并发很好,抛出的错误是:

更新: 合并问题已通过覆盖合并策略修复

0 投票
1 回答
1095 浏览

ios - NSCondition,调用信号时如果没有锁怎么办?

这个 Apple 的关于 的文档中NSCondition, 的用法NSCondition应该是:

标题 1:

线程 2:

方法的文档signalNSConditon

您可以使用此方法唤醒一个正在等待条件的线程。您可以多次调用此方法来唤醒多个线程。如果没有线程在等待条件,则此方法不执行任何操作。为了避免竞争条件,你应该只在接收者被锁定时调用这个方法

我的问题是:

我不希望Thread 2在任何情况下都被阻塞,所以我删除了Thread 2lock中的andunlock调用。也就是说,线程 2可以放任意多的工作,线程 1会一个一个地完成工作,如果没有更多工作,它会等待(阻塞)。这也是生产者-消费者模式,但生产者从未被阻塞。

但是根据 Apple 的文档,这种方式是不正确的 那么这种模式可能会出现什么问题呢?谢谢。

0 投票
1 回答
807 浏览

objective-c - 使用 NSCondition 解锁线程(Objective-C)

我正在使用 Objective-C 并试图使用需要相互通信的线程。

代码如下:

我在两个单独的线程上运行 func1 和 func2 如下

运行此代码时出现以下错误

我想知道我解锁的方式有什么问题。

0 投票
1 回答
114 浏览

objective-c - 具有多个线程的 NSCondtion

方法1:

方法2:

如果线程 1在方法 1 中,通过执行[_condition waitUtilDate ...];它来解锁它的锁。 线程 2 进入该区域,也通过执行等待条件[_condition waitUtilDate ...]

线程 1线程 2都将一个块(请求 1 请求 2)排入队列以从远程获取相同的数据。当请求 1完成时,它调用方法 2 来发出 _condition 信号:

我的问题是:

  • 哪个会发出信号,线程 1线程 2
  • 因为请求 1请求 2做同样的事情,我可以在请求 1完成时向两个线程(broadcast)发出信号并取消请求 2 。但是,更好的方法是在请求 1发出后,拒绝线程 2进入临界区 。但是在进入关键区域之前我无法锁定两次。那么我能做什么呢?

谢谢。

0 投票
2 回答
663 浏览

ios - 除了 API 之外,iOS 中的 NSCondition 和 dispatch_semaphore 有什么区别?

它们都使用计数器,并使用锁来保护计数器的递增和递减,当计数器小于零时,线程等待。在我看来,除了它们的 api 之外,它们是相同的。

0 投票
1 回答
102 浏览

ios - 需要等待 setFocusModeLockedWithLensPosition - Semaphore 完成吗?原子?NS条件?

我对信号量和块都没有太多经验。我已经看到了有关如何将异步调用转换为同步调用的各种建议。在这种情况下,我只想等确定 iPhone 的镜头已经改变焦点,然后再拍摄另一张照片。我添加了一个完成块(用一个小程序来证明我看到了它)。但是如何阻止我的其余代码(在主线程上运行),直到我得到完成回调?

changeFocusSettings 完全是从另一个例程调用的。我在 changeFocusSettings 中成像了某种信号量集,然后 focuscompletionHandler 将其重置。但细节超出了我的范围。
谢谢你。

0 投票
1 回答
707 浏览

ios - 在 tableView 更新期间对数据源的线程安全访问

我的应用程序使用一个tableView可以由多个线程异步更新的数据源。
当数据源改变时,tableView更新,而不是重新加载,使用

completion(finished)一些完成块 在哪里。

通常,tableView更新需要 0.25 秒。在此期间,不得更改数据源。确保这一点的最佳方法是什么?

我可以想象我获得了一个NSConditionbefore tableView.performBatchUpdates,并在完成块中释放它,当然也适用于对数据源的所有其他读写访问,如此处所建议。但大多数关于 SO 的帖子都建议不要使用这种低级同步机制,而是使用 GCD。

一个建议SynchronizedArray是使用具有同步读取和异步屏障写入的并发队列来使用线程安全,这允许并发读取。tableView.performBatchUpdates但是我不知道在使用 GCD期间如何锁定写入。

这个问题有标准解决方案吗?