← 解説「move クロージャ — スレッドに所有権を渡す」に戻る
サンプルコードで身につける: move クロージャ — スレッドに所有権を渡す
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1最小の move — Vec を預けて合計
move を付けて Vec の所有権をスレッドに渡す最小の例です。スレッドは main より長く生きるかもしれないので、借用ではなく所有権ごと渡すのが原則になります。move を消すとコンパイルエラーになるので、エラーメッセージもぜひ一度見てみてください。
Rust
2clone して渡す — 元の変数も使う
move で渡したあとも元の変数を使いたいときは、clone した複製をスレッドに渡します。message は手元に残り、for_thread だけが move されるという切り分けです。設定値やファイルパスのような小さなデータなら、実務でもまず clone で済ませるのが手軽です。
Rust
3ループで分配 — 各スレッドに専用データ
ループの各回で取り出した chunk が、その回に作ったスレッドへ move される様子を示します。データを分割して各スレッドに専用の持ち分を配るのは、並列集計の基本パターンです。join を Vec の順に回しているので、結果の表示順は毎回同じになります。
Rust
4構造体ごと move — 返り値で返してもらう
String や Vec を含む構造体も、move で丸ごとスレッドに預けられます。返り値のタプルで「名前と結果」を返してもらえば、必要なものだけが所有権ごと戻ってくる形になります。ジョブを構造体にまとめてワーカーに渡す、実務でよくある形の縮小版です。
Rust
5ファイル別ワーカーでエラー行を並列集計
ファイル名と中身のペアを1スレッドずつに move して、エラー行数を並列に数える例です。各スレッドが自分のデータだけを所有するので、ロックも共有も要りません。「分けて配って join で集める」は、共有状態なしで済むいちばん安全な並列化です。
Rust