問題タブ [deadlock]

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 投票する
3 に答える
1021 参照

delphi - スレッドを閉じるときのデッドロック

COM ポートを開き、重複した読み取り操作と書き込み操作を処理するクラスを作成しました。これには、2 つの独立したスレッドが含まれています。1 つはデータを読み取り、もう 1 つはデータを書き込みます。どちらも OnXXX プロシージャ (OnRead または OnWrite など) を呼び出して、読み取りまたは書き込み操作の完了を通知します。

以下は、スレッドがどのように機能するかを示す簡単な例です。

Close() プロシージャを見ると、クリティカル セクションに入り、書き込みスレッドを終了し、終了するまで待機することがわかります。書き込みスレッドは、OnWrite メソッドを呼び出すときに書き込まれる新しい値をキューに入れることができるため、TAsyncSerialPort クラスの Write() プロシージャを呼び出すときに、同じクリティカル セクションに入ろうとします。

ここでデッドロックが発生しました。Close() メソッドを呼び出したスレッドは、クリティカル セクションに入り、書き込みスレッドが閉じられるのを待ちます。同時に、そのスレッドは、クリティカル セクションが解放されるのを待ちます。

私はかなり長い間考えてきましたが、その問題の解決策を見つけることができませんでした。問題は、Close() メソッドが終了したときに読み取り/書き込みスレッドが生きていないことを確認したいということです。つまり、これらのスレッドの終了フラグを設定して終了することはできません。

どうすれば問題を解決できますか? シリアルポートを非同期に処理するアプローチを変更する必要があるのでしょうか?

アドバイスありがとうございます。

マリウス。

--------- 編集 ----------
そのような解決策はどうですか?

私の考えが正しければ、これでデッドロックの問題は解決するはずです。残念ながら、書き込みスレッドが閉じられる前に通信ポート ハンドルを閉じてしまいます。つまり、通信ポート ハンドルを引数の 1 つとして受け取るメソッド (Write、Read、WaitCommEvent など) を呼び出すと、そのスレッドで例外が発生する必要があります。そのスレッドでその例外をキャッチした場合、アプリケーション全体の作業に影響しないと確信できますか? この質問はばかげているように聞こえるかもしれませんが、いくつかの例外により、OS がその原因となったアプリケーションを閉じる可能性があると思いますよね? この場合、私はそれを心配する必要がありますか?

0 投票する
9 に答える
39638 参照

java - Java でのプログラムによるデッドロック検出

Java プログラムでデッドロックが発生したことをプログラムで検出するにはどうすればよいですか?

0 投票する
5 に答える
1056 参照

multithreading - 競合などのスレッドの問題を視覚化するのに最適な図のタイプはどれですか?

システムの問題をデバッグしているときに、ボトルネックの原因となっているスレッドの競合を発見しました。この問題を扱っている他の人々にこの現象を説明する必要があります。それらのいくつかは開発チームからのものではありません(しかし、それらはかなり技術的です)。では、競合、デッドロックなどのスレッドの問題を表すために、どのような種類の図を使用できますか?いくつかの例は非常に役立ちます。

0 投票する
4 に答える
743 参照

c# - サードパーティの dll でのデッドロック

2 つの C# アプリケーションで 2 つのサードパーティ dll (a.dll と b.dll) を使用 (および参照) しています。サードパーティ ライブラリの関数を呼び出しているときに両方のアプリケーションがハングするという、繰り返し発生する問題が発生しています。

a.dll と b.dll (a2.dll と b2.dll) のコピーを作成し、それを 2 番目のアプリケーションで使用しようとしましたが、a.dll が b.dll を参照し、anb b.dll が参照していることがわかりました。 a.dll であり、これは正しくロードされません。

デッドロックがあると思われますが、サードパーティのライブラリにあります。これを防ぐためにロックを使用することはできません。各アプリケーションはロックを強制して、そのアプリがライブラリにアクセスするスレッドが一度に 1 つだけになるようにしますが、両方のプログラムをロックすることはできません。

それで、私の質問はどうすればこの問題を解決できますか?

dll を共有したくないことを OS (Windows XP) に伝えることはできますか?

ありがとう、ジョー

0 投票する
4 に答える
19061 参照

c# - デッドロックをデバッグする方法は?

それ以外は、VSデバッガーでアプリケーションを実行していると仮定すると、それが発生したときに再現できるかどうかはわかりません(この特定のアプリケーションを問題なく1〜2週間使用しています)。デッドロックが発生した後、デバッグに取り掛かる必要がありますか?プログラムを一時停止して、別のスレッドが発生したときの場所を確認すると、コールスタックに到達できる可能性があると思いましたが、[一時停止]をクリックすると、アプリケーションを強制終了するまでVisualStudioもデッドロックに陥りました。

ソースツリーを参照して潜在的な問題を見つける以外の方法はありますか?問題が発生した後、コールスタックにアクセスして、問題がどこにあるかを確認する方法はありますか?役立つかもしれない他のツール/ヒント/トリックはありますか?

0 投票する
2 に答える
127 参照

java - Javaデッドロック挑発

私はJavaでいくつかの演習を行っています(コードがどこから来たのかと思う人もいるかもしれません)。次のコードでデッドロック状態を引き起こそうとします:

(javac -version javac 1.6.0_0 uname -a Linux inspiron 2.6.29 #1 SMP Sat May 16 10:56:17 CEST 2009 i686 GNU/Linux)

(他の状況の中でも)以下の出力を取得します。

何が間違っていると思いますか? ロックがスレッド 1 によって解放される前に、スレッド 0 が read() のクリティカル セクションに入り、A のロックを取得する方法さえあります。出力が同期していないため、これは可能ですか? このコードではデッドロックは発生しません。

0 投票する
1 に答える
3399 参照

postgresql - PostgreSQL の排他ロックによりアプリケーションが停止する

私のアプリケーションのテストは、データベースではかなり難しいものです。create、drop、alter table ステートメントを実行します。ただし、デッドロックが発生した場合でも、postresql がこれらを処理することを期待します (つまり、ロックを検出して 1 つのスレッドを削除します)。私も同時にリクエストを実行していません。

ただし、私の場合はフリーズするだけで、手動で手動で強制終了する必要があります (実行順序を少し変更すると機能しますが、自信が持てません)。ロックは、create table ステートメントに排他ロックがあり、トランザクションにも排他ロックがあることを示しています。

誰かが似たようなことを経験しましたか? 役立つサーバー設定はありますか? それとも何かアドバイス?

0 投票する
5 に答える
9435 参照

sql-server - 非クラスター化インデックスでの挿入/削除のデッドロックを解決するには?

デッドロックの問題が発生し、異なるスレッド (2 つは Web サービスと呼ばれる) によって呼び出される 2 つのストアド プロシージャが原因であることがわかりました。

  1. X テーブルにデータを挿入するspを挿入します。
  2. X テーブルのデータを削除するspを削除します。

さらに、Xテーブルの非一意かつ非クラスター化インデックスでデッドロックが発生したことを示す結果が得られました。この問題を解決するためのアイデアはありますか?

アップデート

Read/Write deadlockから、次のステートメントのためにエラーだと思います。

  • insert ステートメントでは、id(クラスター化インデックス) を取得してから、非クラスター化インデックスを取得します。
  • delete ステートメントでは、id の前に非クラスター化インデックスを取得します。

したがって、次のステートメントのように、delete ステートメントの id を選択する必要があります。

PS。両方のストアド プロシージャがトランザクションで呼び出されます。

ありがとう、

0 投票する
7 に答える
19714 参照

java - デッドロックを検出する方法は?同期ブロックのタイムアウト?

複数のスレッドを実行するJavaアプリケーションをデバッグしています。ログをしばらく見てみると、それらのスレッドの1つがもう実行されていないようです。私の推測では、スレッドは決して解放されないロックを待機しています(最後の出力は同期メソッドを呼び出す前です)。

スレッドにタイムアウトを設定できますか?一種の「このロックを待ちますが、10秒後にロックが利用できなくなった場合は、もう待たないでください!」</ p>

0 投票する
1 に答える
1199 参照

java - 単一のJavaセマフォでデッドロック?

私の最近の回答の 1 つで、メモリ リソースへのアクセスを制限する理論的なセマフォの例を示しました。

割り当てインターリーブが悪い場合、これがデッドロックの原因になる可能性があると思います。

私の観察は本当ですか?はいの場合、どうすればこの状況を回避できますか (時間指定待機やロールバックなど)?