C++为线程工作动态地分割例程

C++ dynamically splitting a routine for thread work

本文关键字:分割 例程 动态 工作 线程 C++      更新时间:2023-10-16

下面的C++DoWork1例程计算0到1000之间的每个数字的总和。我们有没有办法动态创建4个版本,每个版本都有不同的四分之一范围,即0-(250-1(、250-(500-1(、500-(750-1(和750-1000?

void DoWork1() {
int n1 = 0;
int p1 = 0;
for (int p1 = 0; p1 <= 1000; p1++)
n1 = n1 + p1;
}

这是为引入线程工作做准备,最终目的是将上述例程动态拆分为最大数量的可用线程,以实现最快的执行时间。我试着让事情尽可能简单,因此作为一名首发球员,我有了这个基本的常规。我知道如果使用相同的变量,可能会出现并发问题——一旦我知道是否有办法实现上述目标,我就可以对此进行更多的研究(除非在本例中可以相对容易地克服并发问题(。

这里有一个基于std::thread的简单解决方案。毫无疑问,您可以根据自己的需求进行调整:

#include <iostream>
#include <thread>
#include <functional>
void sum (int from, int to, int &total_out)
{
int total = 0;
for (int i = from; i < to; ++i)
total += i;
total_out = total;
}
int main() {
int sum1, sum2, sum3, sum4;
std::thread t1 (sum, 0, 250, std::ref (sum1));
std::thread t2 (sum, 250, 500, std::ref (sum2));
std::thread t3 (sum, 500, 750, std::ref (sum3));
std::thread t4 (sum, 750, 1000, std::ref (sum4));
t1.join ();
t2.join ();
t3.join ();
t4.join ();
std::cout << sum1 << ", " << sum2 << ", " << sum3 << ", " << sum4;
}

返回线程结果的另一种机制是使用std::future,如本文所述。