【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が観測できる

となり、子のプロセスでは、サブのスレッドが止まり、ロックも解除されることが分かりました。しゅごい。

 以上です。

ノート   このエントリーをはてなブックマークに追加 
 

prev:日記(2023年12月2日) next:たのしい動画2本

やり散らかし一覧

記事いろいろ