第37章へようこそ。
今日のテーマは、SendとSyncです。
前章で、スレッドに値を渡すときは所有権ごと渡すことを見ました。
moveが、外側の値の所有権をクロージャへ移し、新しいスレッドへ持ち込む。
ただし、すべての値がスレッド境界を越えてよいわけではありません。
ある値をスレッドに渡すと、データ競合という危険が生じる場合がある。
データ競合は、複数の流れが同じ値に同時に触れ、少なくとも一方が書き換えるときに起こる、結果の定まらない状態のことです。
Rustは、この危険を実行してから気づくのではなく、コンパイルの時点で防ぐ。
そのために、どの型がスレッド境界を越えてよいかを、型のうえで区別する。
この区別を担うのが、SendとSyncという2つのトレイトです。
今日扱うのは、SendとSyncがそれぞれ何を表すのか、これらがどう自動的に決まるのか、
そして、なぜRcがこの境界を越えられないのか、という核心です。