Heim >Backend-Entwicklung >C++ >Wie verwende ich STL für verteiltes Rechnen in C++?
Wie verwende ich STL für verteiltes Rechnen in C++? Durch die Verwendung der STL-Algorithmus-Parallelisierung, die Zusammenarbeit mit Ausführenden und die Entwicklung praktischer Fälle wie Bildverarbeitungs-Pipelines.
So verwenden Sie STL für verteiltes Rechnen in C++
Einführung
Beim verteilten Rechnen werden Aufgaben auf mehrere Computerknoten verteilt, um die Verarbeitungsgeschwindigkeit zu erhöhen. Die C++ Standard Template Library (STL) bietet Parallelitätstools, mit denen Sie verteilte Computeranwendungen entwickeln können.
Parallelisieren von STL-Algorithmen
Sie können STL-Algorithmen parallelisieren, indem Sie die Funktionen std::async
und std::future
verwenden. std::async
startet eine asynchrone Aufgabe und gibt ein Handle an das von der Aufgabe generierte std::future
-Objekt zurück. std::async
和 std::future
函数将 STL 算法并行化。std::async
启动一个异步任务,返回指向该任务生成的 std::future
对象的句柄。
// 计算无序向量中所有整数的总和 std::vector<int> numbers = {1, 2, 3, 4, 5}; int sum = 0; // 并行化 for_each 算法 std::for_each(numbers.begin(), numbers.end(), [&](int n) { std::future<int> result = std::async(std::launch::async, [] { return n * n; }); // 在另一个线程中执行的计算 sum += result.get(); }); std::cout << "Sum: " << sum << std::endl;
Using Executors
执行器是并发性库的一部分,提供了跨线程池管理任务的抽象。可以使用 std::execution::parallel_unsequenced
// 查找向量中所有奇数 std::vector<int> numbers = {1, 2, 3, 4, 5}; std::vector<int> oddNumbers; // 使用执行器上的 parallel_unsequenced 策略 std::execution::parallel_unsequenced(numbers.begin(), numbers.end(), [&](int n) { if (n % 2) oddNumbers.push_back(n); }); std::cout << "Odd numbers: "; for (int n : oddNumbers) { std::cout << n << " "; } std::cout << std::endl;
Executors verwenden
Executors sind Teil der Parallelitätsbibliothek und bieten eine Abstraktion für die Verwaltung von Aufgaben über Thread-Pools hinweg. STL-Algorithmen können auf dem Executor mithilfe der Strategiestd::execution::parallel_unsequenced
parallelisiert werden. // 图像处理管道 struct ImageProcessingPipeline { // 调整大小 std::vector<std::future<cv::Mat>> resizeTasks; // 转换 std::vector<std::future<cv::Mat>> convertTasks; // 保存 std::vector<std::future<void>> saveTasks; // 执行管道 std::vector<cv::Mat> execute(const std::vector<cv::Mat>& images) { for (const cv::Mat& image : images) { // 并行化调整大小 resizeTasks.emplace_back(std::async(std::launch::async, [&image] { return resize(image, 500, 500); })); } // 等待所有调整大小的任务完成 for (auto& task : resizeTasks) task.get(); // 并行化转换 for (auto& resizedImage : resizeTasks) { convertTasks.emplace_back( std::async(std::launch::async, [&resizedImage] { return convert(resizedImage); })); } // 等待所有转换任务完成 for (auto& task : convertTasks) task.get(); // 并行化保存 for (auto& convertedImage : convertTasks) { saveTasks.emplace_back(std::async(std::launch::async, [&convertedImage](const std::string& path) { return save(convertedImage, path); }, "output/image_" + std::to_string(i) + ".jpg")); } // 等待所有保存任务完成 for (auto& task : saveTasks) task.get(); } };Praktischer Fall
Parallelisierende Bildverarbeitungspipeline
🎜🎜Stellen Sie sich vor, Sie hätten eine Pipeline zum Verarbeiten von Bildern, einschließlich Vorgängen zur Größenänderung, Konvertierung und Speicherung von Bildern. Durch die Parallelisierung dieser Vorgänge können Sie den Pipeline-Durchsatz erheblich steigern. 🎜rrreee🎜Durch die Verwendung der Parallelitätstools und Executoren von STL können Sie problemlos effiziente verteilte Computeranwendungen in C++ entwickeln. 🎜Das obige ist der detaillierte Inhalt vonWie verwende ich STL für verteiltes Rechnen in C++?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!