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 22:ネットワークプログラミングにおけるソケットとプロトコル

Day 22では、ネットワークプログラミングにおけるソケットとプロトコルについて学習します。 ソケットは、ネットワーク通信を行うためのプログラムインターフェースであり、プロトコルは通信のルールや方法を …

【C++】Day 27:デザインパターン「構造型パターン」

Day 27では、デザインパターンのうち「構造型パターン」について学習します。 構造型パターンは、クラスやオブジェクトの構造を改良するためのパターンです。主な構造型パターンには、アダプタ、デコレータ、 …

【C++】Day 28:デザインパターン「行動型パターン」

Day 28では、デザインパターンのうち「行動型パターン」について学習します。 行動型パターンは、オブジェクト間の相互作用や責任の分担に関するパターンです。主な行動型パターンには、ストラテジ、オブザー …

【C++】Day 1:C++の基礎構文について

Day 1では、C++の基礎構文について学習します。 プログラムの構造: C++プログラムの基本的な構造を理解する。 C++のプログラムはmain()関数からプログラムが開始されます。 後述する演習問 …

【C++】Day 21:ネットワークプログラミングの基礎

Day 21では、ネットワークプログラミングの基礎について学習します。 ネットワークプログラミングは、コンピュータ間でデータを送受信するプログラミングのことを指します。主にソケットを使用してネットワー …