タグ付けされた質問 「deadlock」

2つ(またはそれ以上)の操作が重複するリソースのセットを必要とし、操作を完了してロックを解放するために必要なすべてのロックを取得できないため、どちらも完了できない状況。


8
ロックを取得しようとしたときにmysql 'Deadlockが検出されないようにする方法。トランザクションを再開してください」
オンラインユーザーを記録するinnoDBテーブルがあります。ユーザーがページを更新するたびに更新され、ユーザーが現在アクセスしているページとサイトへの最終アクセス日を追跡します。次に、15分ごとに実行して古いレコードを削除するcronがあります。 ロックを取得しようとしたときに「デッドロック」が見つかりました。昨夜約5分間トランザクションを再起動してみてください。このテーブルに対してINSERTを実行しているときのようです。誰かがこのエラーを回避する方法を提案できますか? ===編集=== 実行中のクエリは次のとおりです。 サイトへの最初の訪問: INSERT INTO onlineusers SET ip = 123.456.789.123, datetime = now(), userid = 321, page = '/thispage', area = 'thisarea', type = 3 ページを更新するたびに: UPDATE onlineusers SET ips = 123.456.789.123, datetime = now(), userid = 321, page = '/thispage', area = 'thisarea', type = 3 WHERE …
286 mysql  deadlock 

3
avs vs Task.Wait-Deadlock?
私はかなりの違いを理解していないTask.Waitとしますawait。 ASP.NET WebAPIサービスには、次のような機能があります。 public class TestController : ApiController { public static async Task<string> Foo() { await Task.Delay(1).ConfigureAwait(false); return ""; } public async static Task<string> Bar() { return await Foo(); } public async static Task<string> Ros() { return await Bar(); } // GET api/test public IEnumerable<string> Get() { Task.WaitAll(Enumerable.Range(0, 10).Select(x => …

7
再帰的ロック(Mutex)と非再帰的ロック(Mutex)
POSIXでは、ミューテックスを再帰的にすることができます。つまり、同じスレッドが同じミューテックスを2回ロックしても、デッドロックは発生しません。もちろん、2回アンロックする必要もあります。そうしないと、他のスレッドがミューテックスを取得できません。pthreadをサポートするすべてのシステムが再帰的ミューテックスもサポートするわけではありませんが、POSIX準拠にしたい場合は、そうする必要があります。 他のAPI(より高レベルのAPI)も、通常はロックと呼ばれるミューテックスを提供します。一部のシステム/言語(Cocoa Objective-Cなど)では、再帰的mutexと非再帰的mutexの両方を提供しています。一部の言語では、どちらか一方しか提供されません。たとえば、Javaミューテックスは常に再帰的です(同じオブジェクトで同じスレッドが2回「同期」する場合があります)。それらが提供する他のスレッド機能によっては、再帰的ミューテックスは自分で簡単に記述できるため、再帰ミューテックスがなくても問題ない場合があります(私は、より単純なミューテックス/条件操作に基づいて、自分で再帰的ミューテックスをすでに実装しています)。 私が本当に理解していないこと:非再帰的mutexは何に適していますか?同じミューテックスを2回ロックする場合、なぜスレッドデッドロックが必要なのですか?それを回避できる高水準言語(たとえば、デッドロックが発生するかどうかをテストし、発生する場合は例外をスローする)でも、通常はそうしません。代わりにスレッドをデッドロックさせます。 これは、誤って2回ロックして1回だけロック解除した場合にのみ発生します。再帰的なmutexの場合、問題を見つけるのは難しくなります。そのため、すぐにデッドロックして、間違ったロックがどこにあるかを確認できますか?しかし、ロックを解除するときにロックカウンターを返すのと同じことはできませんでした。最後のロックを解放し、カウンターがゼロではない場合、例外をスローしたり、問題をログに記録したりできます。または、私が確認できない他のより有用な非再帰的ミューテックスのユースケースはありますか?それとも、非再帰的なミューテックスは再帰的なミューテックスよりもわずかに高速になる可能性があるため、それは単にパフォーマンスかもしれませんか?しかし、私はこれをテストしましたが、違いは実際にはそれほど大きくありません。

17
デッドロックとは何ですか?
マルチスレッドアプリケーションを作成するときに発生する最も一般的な問題の1つは、デッドロックです。 コミュニティへの私の質問は次のとおりです。 デッドロックとは何ですか? それらをどのように検出しますか? それらを処理しますか? そして最後に、どのようにしてそれらが発生するのを防ぎますか?

5
「待つ」は機能しますが、タスクを呼び出します。結果がハング/デッドロックします。
次の4つのテストがあり、最後のテストを実行するとハングします。なぜこれが起こるのですか? [Test] public void CheckOnceResultTest() { Assert.IsTrue(CheckStatus().Result); } [Test] public async void CheckOnceAwaitTest() { Assert.IsTrue(await CheckStatus()); } [Test] public async void CheckStatusTwiceAwaitTest() { Assert.IsTrue(await CheckStatus()); Assert.IsTrue(await CheckStatus()); } [Test] public async void CheckStatusTwiceResultTest() { Assert.IsTrue(CheckStatus().Result); // This hangs Assert.IsTrue(await CheckStatus()); } private async Task<bool> CheckStatus() { var restClient = new …
126 c#  nunit  task  deadlock  async-await 

4
C#での再入可能なロック
次のコードは、.NETでC#を使用してデッドロックを引き起こしますか? class MyClass { private object lockObj = new object(); public void Foo() { lock(lockObj) { Bar(); } } public void Bar() { lock(lockObj) { // Do something } } }

4
プロセスがデッドロックの犠牲者となっている原因
Selectを使用したプロセスで、完了までに5〜10分程度の時間がかかります。現在、MS SQLデータベースエンジンへのヒントとしてNOLOCKを使用していません。同時に、同じデータベースと同じテーブルに更新と挿入を行う別のプロセスがあります。最初のプロセスが開始されましたが、最近メッセージで途中で終了します SQLEXCEPTION:トランザクションは別のプロセスでロックリソース上でデッドロックされ、デッドロックの犠牲者として選択されました。 この最初のプロセスは他のサイトで同じ条件で実行されていますが、データベースが小さいため、問題のselectステートメントの所要時間ははるかに短くなります(30秒程度)。これらの他のサイトでは、これらの他のサイトでデッドロックメッセージが表示されません。また、最初に問題が発生しているサイトでもこのメッセージは表示されませんでしたが、データベースが大きくなるにつれて、何らかのしきい値を超えたに違いないと思います。ここに私の質問があります: トランザクションの実行に時間がかかるため、関連するプロセスにデッドロックの犠牲者としてフラグが立てられる可能性が高くなります。 NOLOCKヒントを使用して選択を実行すると、問題が解決しますか? selectステートメントのWHERE句の一部としてチェックされる日時フィールドが原因で、ルックアップ時間が遅くなっているのではないかと思います。このフィールドに基づいてインデックスを作成できますか?それはお勧めですか?

5
デッドロックを引き起こす非同期/待機の例
c#のasync/ awaitキーワードを使用した非同期プログラミングのベストプラクティスに出くわしました(c#5.0は初めてです)。 与えられたアドバイスの1つは次のとおりです。 安定性:同期コンテキストを知る ...一部の同期コンテキストは非再入可能で、シングルスレッドです。つまり、コンテキスト内で一度に実行できる作業単位は1つだけです。この例は、Windows UIスレッドまたはASP.NET要求コンテキストです。これらのシングルスレッド同期コンテキストでは、自分でデッドロックするのは簡単です。シングルスレッドコンテキストからタスクを生成し、そのコンテキストでそのタスクを待つ場合、待機中のコードがバックグラウンドタスクをブロックしている可能性があります。 public ActionResult ActionAsync() { // DEADLOCK: this blocks on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { // a very simple async method var result = await MyWebService.GetDataAsync(); return result.ToString(); } 自分で分解しようとすると、メインスレッドはで新しいスレッドにスポーンしMyWebService.GetDataAsync();ますが、メインスレッドはそこで待機しているので、で結果を待機しGetDataAsync().Resultます。一方、データの準備ができていると言います。メインスレッドが継続ロジックを継続せず、継続結果の文字列を返すのはなぜGetDataAsync()ですか? 上記の例でデッドロックが発生する理由を誰かが説明してもらえますか?私は問題が何であるかについて完全に無知です...

6
アクティブな例外なしで呼び出されたC ++終了
スレッドでC ++エラーが発生します: terminate called without an active exception Aborted コードは次のとおりです。 #include <queue> #include <thread> #include <mutex> #include <condition_variable> template<typename TYPE> class blocking_stream { public: blocking_stream(size_t max_buffer_size_) : max_buffer_size(max_buffer_size_) { } //PUSH data into the buffer blocking_stream &operator<<(TYPE &other) { std::unique_lock<std::mutex> mtx_lock(mtx); while(buffer.size()>=max_buffer_size) stop_if_full.wait(mtx_lock); buffer.push(std::move(other)); mtx_lock.unlock(); stop_if_empty.notify_one(); return *this; } //POP …

28
簡単なデッドロックの例
初心者にスレッドデッドロックについて説明したいと思います。私は過去に多くのデッドロックの例を見てきました。コードを使用したり、イラストを使用したりします(有名な4台の車など)。The Dining Philosophersのような、簡単に行き詰まりがちな古典的な問題もありますが、本当の初心者には完全に理解するには複雑すぎる場合があります。 デッドロックとは何かを説明する最も簡単なコード例を探しています。例は次のようにする必要があります。 ある意味のある「実際の」プログラミングシナリオに関連する 非常に短く、シンプルでわかりやすい 何がお勧めですか?

3
デッドロックが原因のSqlExceptionをキャッチする方法は?
.NET 3.5から/ C#のアプリは、私がキャッチしたいと思いますSqlExceptionが、それはデッドロックによって引き起こされている場合のみ、SQL Server 2008のインスタンスに。 一般的なエラーメッセージは Transaction (Process ID 58) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. しかし、それはこの例外の文書化されたエラーコードではないようです。 メッセージ内のデッドロックキーワードの存在に対する例外のフィルタリングは、この動作を達成するための非常に醜い方法のようです。誰かがこれを行う正しい方法を知っていますか?

13
確実にデッドロックに陥るプログラムを書く[クローズ]
クローズ。この質問はもっと焦点を合わせる必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てるようにします。 5年前に閉鎖されました。 この質問を改善する 私は最近、この質問を面接で尋ねました。 インターリーブがうまくいかないとデッドロックが発生すると答えましたが、インタビュアーはインターリーブに関係なく常にデッドロックになるプログラムを書くことができると主張しました。 そのようなプログラムを書くことはできますか?そのようなサンプルプログラムを教えていただけますか?

3
静的初期化子でラムダを使用した並列ストリームがデッドロックを引き起こすのはなぜですか?
静的初期化子でラムダを使用して並列ストリームを使用すると、CPU使用率がなく、一見永遠にかかるという奇妙な状況に遭遇しました。コードは次のとおりです。 class Deadlock { static { IntStream.range(0, 10000).parallel().map(i -> i).count(); System.out.println("done"); } public static void main(final String[] args) {} } これは、この動作の最小限の再現テストケースのようです。もし私が: 静的初期化子の代わりにmainメソッドにブロックを配置します。 並列化を削除する、または ラムダを削除し、 コードは即座に完了します。誰かがこの振る舞いを説明できますか?それはバグですか、それともこれは意図されたものですか? OpenJDKバージョン1.8.0_66-internalを使用しています。

8
JavaScriptでロックを実装する方法
lockC#と同等のものをJavaScriptでどのように実装できますか? したがって、私が考えている簡単なユースケースを説明すると、次のようになります。 ユーザーがボタンをクリックしますB。 Bonclickイベントを発生させます。がイベントにある場合Bは、伝播する前にが存在するのをevent-state待ちます。場合であり、ロックされ、に設定され、その後、イベントが伝搬します。イベントの伝播が完了すると、はに設定されます。Bready-stateBready-stateBevent-stateBready-state ready-stateボタンにクラスを追加したり、ボタンからクラスを削除したりするだけで、これに近いことがどのように行われるかがわかりました。ただし、問題は、ユーザーが変数を設定するよりも速くボタンを2回続けてクリックできるため、状況によってはこのロックの試行が失敗することです。 JavaScriptで失敗しないロックを実装する方法を知っている人はいますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.