マルチスレッド C 関数のパフォーマンスを最適化するための主な手法には、次のようなものがあります。 コンパイラ最適化フラグ (-O3 や -Parallel など) 同時コンテナ (std::vector や std::list など) 同期プリミティブ (ロックなど)スマート ポインター (std::shared_ptr や std::unique_ptr など) は、ロック競合を回避します (きめ細かいロックやロックフリーのデータ構造を使用するなど)
マルチスレッド プログラミングでは、関数のパフォーマンスを最適化することが重要です。この記事では、C 関数のマルチスレッド パフォーマンスを最適化するためのさまざまな手法を検討し、実際の例を示します。
コンパイラは、マルチスレッド コードの最適化に役立つさまざまな最適化フラグを提供します。たとえば、-O3
フラグは GCC の高度な最適化を有効にし、-Parallel
フラグはコンパイラに並列処理を使用するように指示します。
実用的なケース:
// 启用优化标志 #pragma GCC optimize("O3", "-parallel") // 优化函数 int sum(const std::vector<int>& numbers) { int result = 0; for (int number : numbers) { result += number; } return result; }
C 標準ライブラリは、std::vector
などの同時コンテナを提供します。および std::list
、これらのコンテナーは最適化されており、マルチスレッド シナリオで安全に使用できます。
実際のケース:
// 使用并发容器 std::vector<int> numbers(1000000); std::atomic<int> result; // 并发地累加数字 std::thread threads[8]; for (int i = 0; i < 8; i++) { threads[i] = std::thread([&numbers, &result, i]() { for (int j = i * numbers.size() / 8; j < (i + 1) * numbers.size() / 8; j++) { result += numbers[j]; } }); } for (int i = 0; i < 8; i++) { threads[i].join(); } // 获取最终结果 int final_result = result.load();
ロックやアトミック変数などの同期プリミティブは、複数のスレッド間のアクセスを調整するために使用されます。これらのプリミティブを適切に使用すると、データの一貫性が保証され、競合状態が回避されます。
実用的なケース:
// 使用互斥量保护共享数据 std::mutex m; int shared_data = 0; // 使用互斥量并发地更新共享数据 std::thread threads[8]; for (int i = 0; i < 8; i++) { threads[i] = std::thread([&m, &shared_data, i]() { for (int j = 0; j < 1000; j++) { std::lock_guard<std::mutex> lock(m); shared_data += i; } }); } for (int i = 0; i < 8; i++) { threads[i].join(); } // 获取最终结果 int final_result = shared_data;
スマート ポインター (std::shared_ptr
や std など) : :unique_ptr
、動的に割り当てられたメモリを自動的に管理できます。これらは、マルチスレッド シナリオでの安全な共有とリリースをサポートします。
実際的なケース:
// 使用智能指针共享对象 std::shared_ptr<MyObject> object = std::make_shared<MyObject>(); // 在多个线程中并发访问共享对象 std::thread threads[8]; for (int i = 0; i < 8; i++) { threads[i] = std::thread([&object, i]() { std::cout << object->getValue() << std::endl; }); } for (int i = 0; i < 8; i++) { threads[i].join(); }
ロック競合とは、複数のスレッドが同じロックを頻繁に競合する状況を指します。ロックの競合は、きめ細かいロックまたはロックフリーのデータ構造を使用することで回避できます。
実際的なケース:
// 使用细粒度锁避免锁争用 std::mutex locks[10]; int shared_data[10]; // 并发地更新共享数据,每个数据块使用自己的锁 std::thread threads[8]; for (int i = 0; i < 8; i++) { threads[i] = std::thread([&locks, &shared_data, i]() { for (int j = 0; j < 1000; j++) { std::lock_guard<std::mutex> lock(locks[i]); shared_data[i] += i; } }); } for (int i = 0; i < 8; i++) { threads[i].join(); } // 获取最终结果 int final_result = 0; for (int i = 0; i < 10; i++) { final_result += shared_data[i]; }
以上がC++ 関数の最適化の詳細な説明: マルチスレッドのパフォーマンスを最適化するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。