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 7:ユーザー定義関数とライブラリ関数について

Day 7では、ユーザー定義関数とライブラリ関数について学習します。 以下にそれぞれの内容を詳細に説明し、例題と演習問題を提示します。   ユーザー定義関数: – ユーザー定義関 …

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

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

【C++】Day 14:C++における文字列操作

Day 14では、C++における文字列操作について学習します。 C++では標準ライブラリである`<string>`を使用して、文字列を操作することができます。 以下に文字列操作の主な内容と …

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

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

【C++】Day 13:メモリ管理とスマートポインタ

Day 13では、メモリ管理とスマートポインタについて学習します。 C++では、メモリの確保と解放を適切に行うことが重要です。スマートポインタは、メモリの自動管理を行う便利な機能です。 以下にそれぞれ …