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 26:デザインパターン「作成型パターン」

Day 26では、デザインパターンのうち「作成型パターン」について学習します。 作成型パターンは、オブジェクトのインスタンスを生成する方法に関するパターンです。主な作成型パターンには、シングルトン、フ …

【C++】Day 9:クラスとオブジェクト

Day 9では、クラスとオブジェクトについて学習します。 以下にそれぞれの内容を詳細に説明し、例題と演習問題を提示します。   クラスとオブジェクトの内容:   1. クラス: & …

【C++】Day 30:C++の応用と展望

Day 30では、「C++の応用と展望」について学習します。 C++は非常にパワフルで柔軟なプログラミング言語であり、さまざまな応用分野で使用されています。この日は、C++の応用領域や将来の展望につい …

【C++】Day 24:デバッグとテスト

Day 24では、デバッグとテストについて学習します。 プログラムを書く際には、バグを見つけて修正するデバッグや、プログラムが正しく動作することを確認するテストが重要です。 以下にデバッグとテストに関 …

【C++】Day 6:関数について

Day 6では、関数について学習します。 関数は、プログラム内で特定のタスクを実行するために使用されるブロック(サブルーチン)です。関数はメインプログラムから呼び出すことができ、再利用性とコードの構造 …