mutexのデッドロック

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
usagi
記事: 9
登録日時: 9年前

mutexのデッドロック

#1

投稿記事 by usagi » 9年前

関数 () { // スレッド
mutex ロック(資源1);
何かの処理
mutex アンロック(資源1);

mutex ロック(資源2);
何かの処理
mutex アンロック(資源2);
}

上記の関数が複数のスレッドにて動いている場合、
デッドロックは起きますか?

必ず、資源1のアンロックをしてから、
資源2のロックをしています。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: mutexのデッドロック

#2

投稿記事 by h2so5 » 9年前

「何かの処理」が何なのかによるのではないかと思います。

usagi
記事: 9
登録日時: 9年前

Re: mutexのデッドロック

#3

投稿記事 by usagi » 9年前

お返事ありがとうございます。

> 「何かの処理」が何なのかによるのではないかと思います。

数値の代入をしています。

関数 () { // スレッド
mutex ロック(資源1);
no_A = w_2;
mutex アンロック(資源1);

mutex ロック(資源2);
no_B = w_3;
mutex アンロック(資源2);
}

上記の場合、どれかのスレッドが
先に資源1を取っても、
解放してから、資源2を取りに行くから
理論的にデッドロックにならないと
思ったのですが...。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: mutexのデッドロック

#4

投稿記事 by YuO » 9年前

usagi さんが書きました:上記の関数が複数のスレッドにて動いている場合、
デッドロックは起きますか?
同時に1つの資源に対するロックしか使わないのであれば,原則としてデッドロックは発生しません。
デッドロックは,2以上のスレッド(等)が,それぞれ1つ以上の資源を確保した状態で,お互いの持っている資源を確保しようとして発生するためです。
# 以上は,最適化と称してコードの順序を入れ替えて,結果的にロックが多重化されるような状況を除く。
usagi さんが書きました:> 「何かの処理」が何なのかによるのではないかと思います。
h2so5さんがこう書かれたのは,「何かの処理」で資源1や資源2に対するロックがある可能性を考えてのことだと思います。

usagi
記事: 9
登録日時: 9年前

Re: mutexのデッドロック

#5

投稿記事 by usagi » 9年前

ありがとうございました。

もやもやが、すっきりしました。

閉鎖

“C言語何でも質問掲示板” へ戻る