C++ での同時プログラミングには共有リソースと同期操作が含まれ、課題を解決するにはエンジニアリングと設計パターンが必要です。エンジニアリング モードには、効率的なスレッド管理のためのマルチスレッド、プロセス、スレッド プール、セマフォ、アトミック操作が含まれます。設計パターンには、データ アクセスと処理を調整するためのプロデューサー/コンシューマー キュー、リーダー/ライター ロック、デッドロック回避、飢餓防止、分割統治などが含まれます。これらのパターンは、画像処理やログ サービスなどの実世界の問題に適用して、効率的な同時プログラムを実装できます。
C++ 同時プログラミングにおけるエンジニアリングとデザイン パターン
はじめに
同時プログラミングでは、データの整合性の問題を回避するために、共有リソースと同期操作を適切に処理する必要があります。 C++ には、これらの課題を解決するためのさまざまなエンジニアリングおよび設計パターンが用意されており、この記事ではこれについて詳しく説明します。
プロジェクトモード
実際のケース:
画像処理にスレッドプールの使用を検討してください。イメージの読み取りと処理は、プール内の複数のスレッドに分散できます。
#include <vector> #include <future> #include <thread> void process_image(const std::string& filename) { // Image processing logic here } int main() { // 创建线程池 std::vector<std::thread> pool; int num_threads = 8; for (int i = 0; i < num_threads; ++i) { pool.push_back(std::thread([] { // 该线程将执行 image_processing() })); } // 提交任务到池 std::vector<std::future<void>> results; std::vector<std::string> filenames = {"image1.jpg", "image2.jpg", ...}; for (const auto& filename : filenames) { results.push_back(std::async(std::launch::async, process_image, filename)); } // 等待任务完成 for (auto& result : results) { result.wait(); } // 关闭线程池 for (auto& thread : pool) { thread.join(); } return 0; }
デザインパターン
実際のケース:
プロデューサー/コンシューマーキューを使用してログサービスを実装することを検討してください。プロデューサ スレッドはイベントをログに記録し、コンシューマ スレッドはログを処理してファイルに書き込みます。
#include <queue> #include <mutex> #include <thread> std::queue<std::string> log_queue; std::mutex log_queue_mutex; void write_log(const std::string& entry) { std::lock_guard<std::mutex> lock(log_queue_mutex); log_queue.push(entry); } void process_logs() { while (true) { std::string entry; { std::lock_guard<std::mutex> lock(log_queue_mutex); if (log_queue.empty()) { // 队列为空时,防止忙等待 std::this_thread::sleep_for(std::chrono::milliseconds(1)); continue; } entry = log_queue.front(); log_queue.pop(); } // 处理日志项 } } int main() { // 创建生产者线程 std::thread producer(write_log, "Log entry 1"); // 创建消费者线程 std::thread consumer(process_logs); producer.join(); consumer.join(); return 0; }
結論
適切なエンジニアリングと設計パターンを採用することで、C++ プログラマは並行プログラムを効果的に実装し、パフォーマンスを最大化し、データの一貫性の問題を軽減できます。
以上がC++ 同時プログラミングにおけるエンジニアリングとデザインのパターン?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。