c++多线程系列
c++多线程thread操作(五)unique_lock加锁
c++多线程thread操作(七)父进程获取子进程变量的结果
(终)c++多线程thread操作(十)多线程并行实现数据相加的和
经过了前面章节内容的学习,下面我们一起来实现一个多线程实现求多个数据相加的和。(这里没有用数组实现,原因在于内存分配给数组的不能有太大空间,N受到限制,不好调试。但是与数组实现方式完全一样!)
假设所要求解的数据长度是N,cpu的核心数是m;
很容易考虑到应将数据尽可能等分给每个cpu运行,故每个cpu运行的数据是:;
其中:
其实现代码如下:这里实现获取子线程结果的方式是加入的引用变量;(可以用future变量,很可惜就是不能提速)
#include <iostream>
#include <thread>
using namespace std;
const int N = 2000000000;
void func_2(int begin, int end, int &res) {
res = 0;
int sum = 0;
for (int kk = 1; kk < 10; kk++)
for (int i = begin; i < end; i++) {
sum = (sum + i + 1);
}
res = sum;
}
int multi_thread() {
int cpu_num = thread::hardware_concurrency();//12
int use_cpu_num = cpu_num;
int split_num = (N + use_cpu_num - 1) / use_cpu_num;
int k1 = 0, k2 = split_num;// k1,k2切分数组
int sum = 0;
int *res = new int[split_num];
thread *th = new thread[use_cpu_num];
for (int i = 0; i < use_cpu_num; i++) {
th[i] = thread(func_2, k1, k2, ref(res[i]));
k1 = k2;
k2 += split_num;
if (k2 >= N)k2 = N;
}
for (int i = 0; i < use_cpu_num; i++)th[i].join();
for (int i = 0; i < use_cpu_num; i++) {
sum = (sum + res[i]);
}
return sum;
}
int main() {
long c1 = clock();
int res;
func_2(0, N, res);
long c2 = clock();
cout << "res = " << res << " , time consume = " << c2 - c1 << endl;
c1 = clock();
int sum = multi_thread();
c2 = clock();
cout << "sum = " << sum << " , time consume = " << c2 - c1 << endl;
return 0;
}
运行结果如下:
res 是单线程获取结果;sum是多线程获取结果
Debug模式测试:多线程加速比大约是:800%-900%
1. cpu=12, kk = 10(第八行);
2. cpu=12, kk = 15(第八行)
3. cpu=12, kk = 30(第八行)
Release测试:多线程加速比大约是:400%-500%
1. cpu=12, kk = 10(第八行);
2. cpu=12, kk = 15(第八行)
3. cpu=12, kk = 30(第八行)
注:
以上只运行了加法运算,如果运行乘除法,加速比会更高!!
下面是采用了求余运算。
void func_2(int begin, int end, int &res) {
res = 0;
int sum = 0;
for (int kk = 1; kk < 10; kk++)
for (int i = begin; i < end; i++) {
sum += (i + 1)%1000;
sum = sum % 1000;
}
res = sum;
}
1. N = 20000000; kk=10
2. N = 200000000;kk=10