Day 19では、マルチスレッドプログラミングにおける同期と通信の重要性について学習します。
マルチスレッドプログラムでは複数のスレッドが同時に動作するため、スレッド同士が競合状態になる可能性があります。同期と通信の機構を使用して、スレッド間の競合を避け、データの正確な共有を確保します。
以下に同期と通信の主な内容と、例題、演習問題を提示します。
同期と通信の主な内容:
1. 同期の重要性:
– 複数のスレッドが同じリソースにアクセスする場合、データの整合性を保つために同期が必要です。
– 同期を行わないと、スレッド同士が競合して不正確な結果や予期しない動作が発生する可能性があります。
2. 同期機構:
– ミューテックス(Mutex): ミューテックスを使用してクリティカルセクション内のコードブロックを保護し、1つのスレッドだけがそのコードブロックにアクセスできるようにします。
– スレッドのロックとアンロック: ミューテックスをロックすることで他のスレッドのアクセスをブロックし、アンロックすることで他のスレッドがアクセスできるようにします。
3. 通信機構:
– 条件変数(Condition Variables): 条件変数を使用してスレッド同士の通信を行います。待機しているスレッドを通知したり、特定の条件が満たされるまで待機したりすることができます。
例題:
#include <iostream> #include <thread> #include <mutex> // ミューテックスと共有変数 std::mutex mtx; int sharedVariable = 0; // スレッド関数:共有変数を1000回増加させる void increaseSharedVariable() { for (int i = 0; i < 1000; ++i) { std::lock_guard<std::mutex> lock(mtx); // ミューテックスをロック sharedVariable++; } } int main() { std::thread thread1(increaseSharedVariable); std::thread thread2(increaseSharedVariable); thread1.join(); thread2.join(); std::cout << "Final sharedVariable: " << sharedVariable << std::endl; return 0; }
演習問題:
1. `std::vector`に整数のデータが格納されているとき、2つのスレッドを使用してデータの合計値を計算するプログラムを作成してください。スレッド間のデータ競合を避けるために適切な同期機構を使用してください。
2. 複数のスレッドが`std::vector`に要素を追加するプログラムを作成してください。要素の追加が終了したら、別のスレッドがベクトルの内容を表示するようにしてください。これらのスレッド間で適切な通信機構を使用してください。
これらの例題と演習問題を解くことで、マルチスレッドプログラミングにおける同期と通信の重要性を理解し、競合状態の回避とデータの正確な共有を実現するスキルを向上させることができます。問題を解いたら、スレッド間の同期と通信が正しく機能しているかどうかを確認してみてください。