質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

2回答

1314閲覧

1行だけのlockはdead lockしないのはなぜ

qope

総合スコア16

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

2クリップ

投稿2023/11/17 10:54

次のコードがdead lockしない理由が分かりません。

rust

1use std::sync::Mutex; 2 3fn main() { 4 let x = Mutex::new(0usize); 5 6 // does'nt deadlock 7 *x.lock().unwrap() = 1; 8 9 let y = x.lock().unwrap(); 10 println!("{}", y); 11}

次のようにxへの書き込みを2行に分けると期待通りdeadlockします。

rust

1use std::sync::Mutex; 2 3fn main() { 4 let x = Mutex::new(0usize); 5 6 // deadlock 7 let mut a = x.lock().unwrap(); 8 *a = 1; 9 10 let y = x.lock().unwrap(); 11 println!("{}", y); 12}

別の変数を用意せずに1行だけ使う場合はMutexGuardがdropされる仕様なのかなと推測しているのですが、該当する情報ソースが見つからず質問させていただきました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

lock が返すのは LockResult<MutexGuard<'_, T>> 型です。 MutexGuard がロックを表現する値です。 この値が「存在している間」がロックされる期間です。

言い換えるなら MutexGuardDrop が実装されていて、 drop の中でドロップを解除するようになっているということです。

Rust では式が返す値を変数に入れなかった場合には原則としてそれを囲むステートメントが終わった時点で破棄されます。 つまりこの場合で言えば *x.lock().unwrap() = 1; という一行が終わったときが MutexGuard の破棄タイミングであり、ロックの解除タイミングでもあるわけです。

投稿2023/11/17 15:08

編集2023/11/18 00:45
SaitoAtsushi

総合スコア5466

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qope

2023/11/18 09:37

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

0

ベストアンサー

Rustにおいて、変数はほかの多くの言語同様にスコープの最後まで生き残り続けます。

上のコードでは、一度目の変更にあたって変数を作っておらず、ロックはその場で生成され消滅します。
そのため、二度目の変更の際に問題なくロックを行うことができます。

一方で下のコードでは変数にロックが束縛され、スコープの最後まで生き続けます。
そのため、二度目の変更の際にはMutexはすでにロックされており、新たなロックを取得できずデッドロックします。

投稿2023/11/17 13:34

編集2023/11/17 13:37
equal-l2

総合スコア172

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qope

2023/11/18 09:36

ご回答ありがとうございました。これまで`lock()`を使う際はdeadlockを防ぐために{}で括っていたのですが、1行だけの場合は不要と考えて良いのでしょうか?それとも1行だけでも念のため{}で括った方が良かったりしますか?
equal-l2

2023/11/18 09:59

一般的なコード規約では波かっこを禁止するルールはないようなので、わかりやすいようにすればよいと思います。
qope

2023/11/18 10:13

参考になります。ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問