【Rust】傍らで走らせたスレッドがMutexのロックをかけた状態でプロセスがフォークしたら子のプロセスでロックは外れるのか
Wed Dec 13 18:48:06 JST 2023 (modified: Wed Dec 13 19:31:21 JST 2023)
views: 1014, keywords:Rust, thread, fork
連載のため、表題の疑問を確認するための実験してみました。もう少し詳しく書くと、こういう実験です。
- 実験の内容
- あるプログラムでサブのスレッドをひとつ作って、ある変数に対してロックをかけっぱなしにする(もとのスレッドは「メインのスレッド」と呼びましょう。)
- メインのスレッドでフォークをかける
- このとき、子のプロセスでサブのスレッドは止まる(参考)
- 疑念: 子のサブのスレッドがロックをかけたまま止まるので、子でロックが外れないのではないか?
先に結論
下記の実験の結果を見ると、ロックは外れるみたいです。(コードを解読すれば完璧ですが、それはまだです。誰か〜〜〜〜誰か氏〜〜〜〜〜〜)
実験
使ったコード
こんな感じ。リポジトリはここです。8行目でArc(参照カウンタ)とMutex(排他制御のための型)にくるんだ文字列をひとつ作って、これを
- サブのスレッド
- 親のメインスレッド
- 子のメインスレッド
で読み書きしています。サブのスレッドが5秒間ロックをかけたあと、おもむろにwritten
と書き込みます。嫌がらせです。メインスレッドの親子は、この嫌がらせが終わるまで、文字列を読み書きできなくなります。
コードの実行結果
次のような出力が得られました。
要点を整理すると、
- 子のメインスレッド
- ロックが解除されて1秒後から出力がある
- サブのスレッドが止まるので
written
という文字は何秒たっても出てこない
- 親のメインスレッド
- ロックが解除されておらず5秒後まで出力がない
- ロックが外れると
written
が観測できる
となり、子のプロセスでは、サブのスレッドが止まり、ロックも解除されることが分かりました。しゅごい。
以上です。