HiroLab

プログラミングに関する情報発信サイト。

C++

【C++】Day 19:マルチスレッドプログラミングにおける同期と通信の重要性

投稿日:

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`に要素を追加するプログラムを作成してください。要素の追加が終了したら、別のスレッドがベクトルの内容を表示するようにしてください。これらのスレッド間で適切な通信機構を使用してください。

これらの例題と演習問題を解くことで、マルチスレッドプログラミングにおける同期と通信の重要性を理解し、競合状態の回避とデータの正確な共有を実現するスキルを向上させることができます。問題を解いたら、スレッド間の同期と通信が正しく機能しているかどうかを確認してみてください。

-C++
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

【C++】Day 15:C++のテンプレート

Day 15では、C++のテンプレートについて学習します。 テンプレートは、汎用的なプログラムを作成するための強力な機能で、関数やクラスを汎用的に定義することができます。 以下にテンプレートの主な内容 …

【C++】Day 18:マルチスレッドプログラミングの基礎

Day 18では、マルチスレッドプログラミングの基礎について学習します。 マルチスレッドプログラミングは、複数のスレッドを使用してプログラムを並行して実行することを意味します。各スレッドは独立して動作 …

【C++】Day 23:ネットワークプログラミングの応用

Day 23では、ネットワークプログラミングの応用について学習します。 ネットワークプログラミングは、クライアントとサーバーの間でデータを送受信するだけでなく、さまざまな応用があります。 以下にネット …

【C++】Day1-30 総復習/演習問題

以下に、Day 1-30までのC++学習カリキュラムにおける総復習と演習問題を提示します。 演習問題に対する回答と解説も記載しますので、各問題に取り組んで理解を深めてください。 ※後半に回答/解説を記 …

【C++】Day 17:例外安全性とエラーハンドリング

Day 17では、例外安全性とエラーハンドリングについて学習します。 C++では、プログラムが例外(予期しないエラー状態)に遭遇した際に、そのエラーを適切に処理することが重要です。例外安全性は、プログ …