问题标签 [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.
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 解锁条件和方法也解锁。
根本原因(见上文)是锁是由方法(工作者/消费者)获取的,而它应该是由数据生产者获取的。我花了很多时间试图弄清楚这一点。我的一个想法是使用两个NSCondition
s,但我无法弄清楚这一点,因为事情是相互交织的。
注意:我觉得奇怪的是警告没有出现在-statementunlock
内部。if
谢谢你的时间!
ios - 调用后台方法iOS时显示错误[NSConditionLock lockWhenCondition:beforeDate:]
当我在后台运行多个方法时,我的应用程序有时会显示以下错误。它说它无法执行后台方法。
为什么我的应用会出现此错误?我该如何解决这个问题?
ios - NSCondition 被无效线程锁定
我正在尝试创建一个多线程过渡动画系统,但对我用于同步的 NSCondition 对象中看似损坏的状态感到困惑。我在下面的调试器中添加了一些行来说明正在发生的事情:
-lock
令我困惑的是 condvar 的描述给出的地址和名称,因为它们与调用条件的 NSThread 的名称和地址不匹配。此外,检查 NSCondition 本身的实际内容也无济于事,因为它的_priv
指针为 nil。有没有人有这方面的经验或知道如何解决?
PS 在人们建议我只使用 GCD 进行并发之前:我正在为我的动画使用 CADisplayLinks,所以我需要使用 NSThreads,因为 CADisplayLinks 需要一个 NSRunLoop 来触发更新。
ios - 核心数据并发:避免在两个不同的地方写入
在登录私有上下文后(以避免主线程阻塞),我正在做一些繁重的核心数据插入工作(比如 A )。在这完成之前,不幸的是在代码中的某个地方还有一个插入工作(比如 B)(不是很重),但它是必不可少的,并且还使用私有上下文来保存。
问题:在将记录保存在任何地方时,我检查它们是否已经在数据库中(以确保唯一的记录),但是在完成上述任务并检查 coredata 后,我发现一些记录重复,这仅仅是因为在我打电话之前在任务 A 处“保存”,另一个进程 B 已经写入了重复记录。
我正在寻找解决方案,可以预见两种选择:
- 让第二个任务等待第一个任务(在另一个线程中调度并等待直到完成)
- 请推荐!!
编辑: 事实证明,问题更多地与合并而不是并发有关,合并创建重复记录,并发很好,抛出的错误是:
更新: 合并问题已通过覆盖合并策略修复
ios - NSCondition,调用信号时如果没有锁怎么办?
从这个 Apple 的关于 的文档中NSCondition
, 的用法NSCondition
应该是:
标题 1:
线程 2:
您可以使用此方法唤醒一个正在等待条件的线程。您可以多次调用此方法来唤醒多个线程。如果没有线程在等待条件,则此方法不执行任何操作。为了避免竞争条件,你应该只在接收者被锁定时调用这个方法。
我的问题是:
我不希望Thread 2在任何情况下都被阻塞,所以我删除了Thread 2lock
中的andunlock
调用。也就是说,线程 2可以放任意多的工作,线程 1会一个一个地完成工作,如果没有更多工作,它会等待(阻塞)。这也是生产者-消费者模式,但生产者从未被阻塞。
但是根据 Apple 的文档,这种方式是不正确的 那么这种模式可能会出现什么问题呢?谢谢。
objective-c - 使用 NSCondition 解锁线程(Objective-C)
我正在使用 Objective-C 并试图使用需要相互通信的线程。
代码如下:
我在两个单独的线程上运行 func1 和 func2 如下
运行此代码时出现以下错误
我想知道我解锁的方式有什么问题。
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进入临界区 。但是在进入关键区域之前我无法锁定两次。那么我能做什么呢?
谢谢。
ios - 除了 API 之外,iOS 中的 NSCondition 和 dispatch_semaphore 有什么区别?
它们都使用计数器,并使用锁来保护计数器的递增和递减,当计数器小于零时,线程等待。在我看来,除了它们的 api 之外,它们是相同的。
ios - 需要等待 setFocusModeLockedWithLensPosition - Semaphore 完成吗?原子?NS条件?
我对信号量和块都没有太多经验。我已经看到了有关如何将异步调用转换为同步调用的各种建议。在这种情况下,我只想等确定 iPhone 的镜头已经改变焦点,然后再拍摄另一张照片。我添加了一个完成块(用一个小程序来证明我看到了它)。但是如何阻止我的其余代码(在主线程上运行),直到我得到完成回调?
changeFocusSettings 完全是从另一个例程调用的。我在 changeFocusSettings 中成像了某种信号量集,然后 focuscompletionHandler 将其重置。但细节超出了我的范围。
谢谢你。
ios - 在 tableView 更新期间对数据源的线程安全访问
我的应用程序使用一个tableView
可以由多个线程异步更新的数据源。
当数据源改变时,tableView
更新,而不是重新加载,使用
completion(finished)
一些完成块 在哪里。
通常,tableView
更新需要 0.25 秒。在此期间,不得更改数据源。确保这一点的最佳方法是什么?
我可以想象我获得了一个NSCondition
before tableView.performBatchUpdates
,并在完成块中释放它,当然也适用于对数据源的所有其他读写访问,如此处所建议的。但大多数关于 SO 的帖子都建议不要使用这种低级同步机制,而是使用 GCD。
一个建议SynchronizedArray
是使用具有同步读取和异步屏障写入的并发队列来使用线程安全,这允许并发读取。tableView.performBatchUpdates
但是我不知道在使用 GCD期间如何锁定写入。
这个问题有标准解决方案吗?