恐れ知らずの並行性
並行プログラミングを安全かつ効率的に扱うことは、Rust のもう 1 つの 主要な目標です。並行プログラミング では、プログラムの異なる部分が 独立して実行され、並列プログラミング では、プログラムの異なる部分が 同時に実行されます。より多くのコンピュータが複数のプロセッサを活用する ようになるにつれて、これらはますます重要になっています。歴史的に、 こうした状況でのプログラミングは難しく、エラーが起こりやすいものでした。 Rust はこれを変えようとしています。
当初、Rust チームは、メモリ安全性を確保することと並行性の問題を防ぐことは 異なる方法で解決すべき 2 つの別個の課題だと考えていました。時間がたつに つれて、チームは、所有権システムと型システムが、メモリ安全性 と 並行性の問題の両方を管理するのに役立つ強力な道具立てであることを 発見しました! 所有権と型チェックを活用することで、多くの並行性エラーは、 Rust では実行時エラーではなくコンパイル時エラーになります。したがって、 実行時の並行性バグが発生する正確な状況を再現しようとして多くの時間を 費やす代わりに、誤ったコードはコンパイルされず、その問題を説明する エラーが示されます。その結果、コードが本番環境にリリースされたあとでは なく、作業中の段階で修正できます。Rust のこの側面を 恐れ知らずの 並行性 と呼んでいます。恐れ知らずの並行性によって、気づきにくいバグの ないコードを書けるようになり、新たなバグを持ち込むことなく簡単に リファクタリングできます。
注: 簡単にするため、多くの問題について、より正確に 並行および/または並列 と言う代わりに 並行 と呼びます。この章では、 並行 という語を使うたびに、頭の中で 並行および/または並列 と 読み替えてください。次章では、この違いがより重要になるため、より具体的に 述べます。
多くの言語は、並行性の問題を扱うために提供する解決策について教条的です。 たとえば、Erlang にはメッセージパッシングによる並行性のための洗練された 機能がありますが、スレッド間で状態を共有する方法はわかりにくいものしか ありません。可能な解決策の一部だけをサポートするのは、高水準言語に とって妥当な戦略です。なぜなら、高水準言語は、抽象化を得るために ある程度の制御を手放す代わりに恩恵をもたらすからです。しかし、低水準 言語には、どのような状況でも最良の性能を発揮する解決策を提供し、 ハードウェアに対する抽象化をより少なくすることが期待されます。したがって、 Rust は、あなたの状況と要件に適した方法で問題をモデル化するための さまざまなツールを提供しています。
この章で扱うトピックは次のとおりです。
- 複数のコード片を同時に実行するためのスレッドを作成する方法
- チャネルがスレッド間でメッセージを送信する メッセージパッシング による 並行性
- 複数のスレッドがあるデータにアクセスできる 共有状態 による並行性
- Rust の並行性に関する保証を、ユーザー定義型だけでなく標準ライブラリが
提供する型にも拡張する
SyncとSendトレイト