問題タブ [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 - シグナルと待機の場所が 2 つある場合の NSCondition の使用方法
メソッドにあるものの擬似コードは次のとおりです。
問題は、最初のイベント 2 が発生し、次にイベント 1 が発生したときに、iOS (上記を参照) から「ロックされていないときにロックが解除されました」という警告が表示されることです。
ここで、私が達成しようとしていることを説明しましょう。これはデータ フェッチャーの一部です。通常の場合、データが受信され、ブロック 1 が実行されます: 問題はありません。場合によっては、データのないブロック 2 が最初に誤って実行され、その直後にブロック 1 が実行されることがあります。これは私がNSCondition
警告を受け取るときです。このまれなケースを見つけるために、私は2.0
数秒待ちます。何が起こるかは次のとおりです。
- Block2 は状態を通知します。
- Lock-1 は失敗します。
predicate
もうない0
ので、待つ必要はありません。- 条件が再びアンロックされます。
- 次に
if
、条件(predicate == 2)
が true であるステートメントに進みます。 - メソッドはすぐに Lock-2 を取得します。<<<< 根本原因
- その後、メソッドは
2.0
数秒間待機します。 - この 2 秒以内に block1 が実行され、状態が通知されます。
- 次に、block1 が条件のロックを解除し、メソッドのロックも解除します。
根本的な原因 (上記を参照) は、ロックがメソッド (ワーカー/コンシューマー) によって取得されているのに、データ プロデューサーによってロックが取得されているはずです。私はこれを理解しようと多くの時間を費やしました。私が持っていた考えの 1 つは 2 つNSCondition
の を使用することでしたが、物事がかなり絡み合っているため、これを理解できませんでした。
unlock
注: ステートメントの内側に警告が表示されないのは奇妙if
です。
御時間ありがとうございます!
ios - NSCondition が無効なスレッドによってロックされました
マルチスレッドのトランジション アニメーション システムを作成しようとしていますが、同期に使用している NSCondition オブジェクトの状態が破損しているように見えて混乱しています。何が起こっているかを説明するために、以下のデバッガーからいくつかの行を追加しました。
私を混乱させているのは-lock
、条件で呼び出している NSThread の名前とアドレスと一致しないため、condvar の説明で指定されたアドレスと名前です。さらに、NSCondition 自体の実際の内容を調べても、_priv
ポインターが nil であるため役に立ちません。誰もこれを経験したことがありますか、それを修正する方法を知っていますか?
PS 同時実行に GCD を使用することを人々が提案する前に: 私はアニメーションに CADisplayLinks を使用しているため、更新をトリガーするには CADisplayLinks が NSRunLoop を必要とするため、NSThreads を使用する必要があります。
ios - コア データの同時実行: 2 つの別々の場所への書き込みを避ける
プライベート コンテキストにログインした直後に (メイン スレッドのブロックを回避するため) 、少し重いコア データ挿入作業(たとえば A)を実行しています。これが完了する前に、残念ながらコードのどこかに挿入作業(B など)があります (重くはない) が、これは不可欠であり、プライベート コンテキストを使用して保存します。
問題:どこにでもレコードを保存しているときに、それらがすでにDBにあるかどうかを確認します(一意のレコードを確保するため)。タスク A で「保存」すると、他のプロセス B はすでに重複レコードを書き込んでいました。
解決策を探していますが、次の 2 つの選択肢があります。
- 2 番目のタスクが最初のタスクを待機するようにする (別のスレッドでディスパッチし、完了するまで待機する)
- お願いします!!
編集: 問題は同時実行性ではなくマージに関連していることが判明しました。マージにより重複レコードが作成され、同時実行性は問題ありません。スローされるエラーは次のとおりです。
更新: マージの問題は上書きマージ ポリシーで修正されました
ios - NSCondition、信号呼び出し時にロックがない場合はどうなりますか?
に関するこの Apple のドキュメントからNSCondition
、の使用法は次のようにNSCondition
なります。
スレッド 1:
スレッド 2:
そして、メソッドのドキュメントsignal
でNSConditon
:
このメソッドを使用して、条件で待機している 1 つのスレッドをウェイクアップします。このメソッドを複数回呼び出して、複数のスレッドを起動することができます。条件で待機しているスレッドがない場合、このメソッドは何もしません。競合状態を回避するには、レシーバーがロックされているときにのみこのメソッドを呼び出す必要があります。
私の質問は:
どのような状況でもThread 2がブロックされたくないので、 Thread 2を削除しlock
てunlock
呼び出します。つまり、スレッド 2は好きなだけ作業を行うことができ、スレッド 1はその作業を 1 つずつ実行し、それ以上作業がなければ待機 (ブロック) します。これも生産者と消費者のパターンですが、生産者がブロックされることはありません。
しかし、Apple のドキュメントによると、この方法は正しくありません。では、このパターンで何がうまくいかないのでしょうか? ありがとう。
objective-c - NSCondition を使用したスレッドのロック解除 (Objective-C)
私は Objective-C を使用しており、互いに通信する必要があるスレッドを操作しようとしていました。
コードは次のとおりです。
以下のように、2 つの別々のスレッドで func1 と func2 を実行します。
このコードを実行すると、次のエラーが表示されます
ロックを解除する方法に何が問題なのか疑問に思っています。
objective-c - 複数のスレッドを持つ NSCondtion
方法 1:
方法 2:
Thread 1が method1 にある場合、実行すること[_condition waitUtilDate ...];
でロックが解除されます。 スレッド 2 はこの領域に入り、さらに を実行して条件を待ち[_condition waitUtilDate ...]
ます。
スレッド 1とスレッド 2の両方がブロック ( request 1 request 2 ) をキューに入れ、リモートから同じデータを取得しました。リクエスト 1が終了すると、メソッド 2 を呼び出して _condition を通知します。
私の質問は次のとおりです。
- Thread 1とThread 2のどちらが通知されますか?
- リクエスト 1とリクエスト 2は同じことを行っているため、両方のスレッド ( ) にシグナルを送って、リクエスト 1が終了したときにリクエスト2
broadcast
をキャンセルできます。ただし、より良い方法は、リクエスト 1が送信された後、スレッド 2がクリティカル エリアに入るの を拒否することです。しかし、クリティカルエリアに入る前に2回ロックすることはできませんでした. それで、なにかお手伝いできますか?
ありがとう。