HiroLab

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

C++

【C++】Day 20:マルチスレッドプログラミングの応用

投稿日:

Day 20では、マルチスレッドプログラミングの応用について学習します。

マルチスレッドプログラムは様々な応用が可能であり、より高度なスレッド制御や同期手法を使用して性能や効率を向上させることができます。

以下にマルチスレッドプログラミングの応用に関する主な内容と、例題、演習問題を提示します。

 

マルチスレッドプログラミングの応用:

1. スレッドプール:
– スレッドプールは、事前に複数のスレッドを生成し、タスクの実行に再利用する手法です。
– スレッドの作成や削除にかかるオーバーヘッドを減らし、スレッドの再利用により効率的な並行処理を実現します。

 

2. プロデューサー・コンシューマーパターン:
– プロデューサー・コンシューマーパターンは、生産者と消費者が同時に動作する場合の効果的なスレッド間通信手法です。
– キューやバッファを使用してデータの送受信を行い、データの制御と同期を行います。

 

3. デッドロック回避とデッドロック解消:
– マルチスレッドプログラムではデッドロック(相互にロックし合う状態)に陥る可能性があります。
– デッドロック回避とデッドロック解消の技法を用いてデッドロックを回避し、問題が発生した場合に解消する方法を学びます。

 

例題:

#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <queue>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;
std::queue<int> dataQueue;

// プロデューサー関数
void producer() {
for (int i = 1; i <= 10; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(200)); // 200ミリ秒待機
std::unique_lock<std::mutex> lock(mtx);
dataQueue.push(i);
std::cout << "Produced: " << i << std::endl;
cv.notify_one(); // コンシューマーを起こす
}
}

// コンシューマー関数
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !dataQueue.empty(); }); // データが空でない場合に待機解除
int data = dataQueue.front();
dataQueue.pop();
std::cout << "Consumed: " << data << std::endl;
}
}

int main() {
std::thread producerThread(producer);
std::thread consumerThread(consumer);

producerThread.join();
consumerThread.join();

return 0;
}

 

演習問題:

1. プロデューサー・コンシューマーパターンを使用して、複数の生産者がデータを生成し、複数の消費者がデータを消費するプログラムを作成してください。データの送受信に適切な同期機構を使用してください。

2. スレッドプールを実装し、指定された数のスレッドで複数のタスクを並行して実行するプログラムを作成してください。タスクは関数として定義し、スレッドプール内のスレッドがその関数を実行します。

これらの例題と演習問題を解くことで、マルチスレッドプログラミングの応用における高度なスレッド制御や同期技術を理解し、効率的な並行処理を実現するスキルを向上させることができます。問題を解いたら、スレッドプールやプロデューサー・コンシューマーパターンが正しく動作しているかどうかを確認してみてください。

-C++
-, ,

執筆者:


comment

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

関連記事

【C++】Day 25:パフォーマンスと最適化

Day 25では、パフォーマンスと最適化について学習します。 プログラムのパフォーマンスは、実行速度やメモリ使用量などの面での良し悪しを指します。最適化は、プログラムのパフォーマンスを向上させるために …

【C++】Day 10:継承とポリモーフィズム

Day 10では、継承とポリモーフィズムについて学習します。 以下にそれぞれの内容を詳細に説明します。   継承: 1. 継承の概念: – 継承は、既存のクラス(ベースクラスまた …

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

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

【C++】Day 22:ネットワークプログラミングにおけるソケットとプロトコル

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

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

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