問題タブ [reentrancy]
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.
java - synchronized() と ReentrantLock.lock() の混合
Java では、?ReentrantLock.lock()
とReetrantLock.unlock()
同じロック メカニズムを使用します。synchronized()
私の推測では「いいえ」ですが、間違っていることを願っています。
例:
スレッド 1 とスレッド 2 の両方が以下にアクセスできるとします。
スレッド 1 が実行されます。
スレッド 2 の実行:
スレッド 1 が最初にその部分に到達し、次にスレッド 1 が終了する前にスレッド 2 に到達すると仮定します。スレッド 2 は、スレッド 1 がsynchronized()
ブロックを離れるのを待ちますか、それとも先に進んで実行しますか?
gcc - gcc と再入可能コード
GCC はすべてのシナリオで再入可能コードを生成しますか?
recursion - 再入可能性と再帰
すべての再帰関数は再入可能である必要があると言うのは本当でしょうか?
php - MySQL と PHP: 2 つの後続のクエリを実行する PHP コード ブロックのアトミック性と再入可能性 - どれほど危険か?
MySQL では、select クエリがレコードを返したかどうかを確認する必要があります。そうでない場合は、レコードを挿入します。残念ながら、PHP スクリプトの if-else 操作全体は、私が望むほどアトミックではありません。たとえば、同じレコードを操作する必要がある場所でスクリプトの別のインスタンスが呼び出された場合など、いくつかのシナリオで壊れます。
ここではトランザクションを使用せず、自動コミットをオンにしています。PHP 5.3 で MySQL 5.1 を使用しています。テーブルは InnoDB です。上記のコードが最適ではなく、実際に壊れるかどうかを知りたいです。つまり、同じスクリプトが 2 つのインスタンスによって再入力され、次のクエリ シーケンスが発生します。
- インスタンス1はレコードを選択しようとしますが、何も見つかりません。挿入クエリのブロックに入ります
- インスタンス 2 はレコードを選択しようとしますが、何も見つかりません。挿入クエリのブロックに入ります。
- インスタンス 1 はレコードの挿入を試み、成功します
- インスタンス 2 がレコードを挿入しようとして失敗し、スクリプトを自動的に中止します
つまり、インスタンス 2 は中止され、エラーが返され、insert クエリ ステートメントに続くものはすべてスキップされます。エラーを致命的ではないようにすることもできますが、エラーを無視するのは好きではありません。
更新:私がやったこと(これはSOで大丈夫ですか?)
問題のテーブルは、アプリケーションが各受信者に送信するメッセージの量を調整 (実際には許可/拒否) するのに役立ちます。システムは、期間 Z 内に X 個を超えるメッセージを受信者 Y に送信してはなりません。表は [概念的に] 次のとおりです。
そして、テーブル内の適切なデータを維持し、スロットル状態に応じてメッセージの送信を許可/拒否するアトミック トランザクションを実行することになっている [やや簡略化/概念的な] PHP コードのブロック:
さて、InnoDB のデッドロックが発生するという事実を無視して、これはかなり良いことではないでしょうか? 私は胸をドキドキしているわけではありませんが、これは、MyISAM を使用してテーブル全体をロックすることを除いて、私ができるパフォーマンス/安定性の最良の組み合わせです。選択します。
c# - C#でのスレッド化と静的メソッド
例として、意味のない拡張メソッドを次に示します。
実行のスレッドが次の行まで完了したとします。
次に、プロセッサはコンテキストスイッチを実行し、別のスレッドが同じメソッドに入り、次の行を完成させます。
最初のスレッドによって作成および割り当てられた変数「x」が、2番目のスレッドによって作成および割り当てられた変数「x」とは別のスタックにあると仮定して正しいですか?つまり、このメソッドは再入可能ですか?
c - Cでのリエントラントライブラリの設計
Cでcuuxをスポークするライブラリを構築しているとしましょう。
Quuxを正常にスポークするには、次の2つの状態変数が必要です。
そのデータをグローバル変数として保存すると、一度に1つのクライアントのみがキューをスポークできます。そうしないと、状態変数が2番目の呼び出し元によって破壊され、災害が発生する可能性があります。
問題は、Cでリエントラントライブラリを設計するための最良の方法は何ですか?
私は以下のケースを楽しませましたが、満足のいく結論には至りませんでした。
次の場合、問題はクライアントを各状態に関連付ける方法です。
次の場合、クライアントは状態を混乱させる可能性があり、非常に望ましくありません
では、これを適切に行う方法は?
c++ - C、C++ での再入可能コードの推奨プラクティス
再入可能コードを作成する際の推奨プラクティスに関する再入可能ガイドを調べていました。
このトピックを扱っている他の参考文献やリソースは?
これらの問題をチェックするために使用できるリントのようなツールは何ですか?
perl - 変数を配列にプッシュすることはスレッドセーフな操作ですか?
私は次のPerlコードを持っています:
複数のスレッドが多くのスレッドでこれと同じ操作を実行する場合、操作はアトミックですか、それともロックを使用する必要がありますか?
c# - 管理された待機を伴うGUIリエントラント
NotifyIconsを使用すると、再入可能性の問題が見つかりました。再現は本当に簡単です。フォームにNotiftIconをドロップするだけで、クリックイベントは次のようになります。
また、いくつかの競合を引き起こすバックグラウンドスレッドを開始します。
ここで、notifyiconをクリックし始めると、メッセージがポップアップ表示され、再入可能性を示します。STAでのマネージド待機が一部のウィンドウにメッセージを送信する必要がある理由を認識しています。しかし、notifyiconのメッセージがポンピングされる理由はわかりません。また、メソッドに出入りするときにブールインジケーターを使用せずにポンピングを回避する方法はありますか?
c - malloc()とprintf()が非再入可能と言われるのはなぜですか?
malloc()
UNIXシステムでは、非再入可能関数(システムコール)であることがわかっています。何故ですか?
同様に、printf()
リエントラントではないとも言われています。なぜ?
再入可能性の定義は知っていますが、なぜこれらの関数に適用されるのか知りたいと思いました。彼らが再入可能であることが保証されるのを妨げるものは何ですか?