题目:用多线程计算 1+2+3+…+…+100 = 5050
希望有4个线程,每个线程处理25个数字。
如下:
#include <iostream>
#include <thread>
#include <windows.h>
#include <vector>
#include <numeric>
using namespace std;
int parallel_accumulate(vector<int>::iterator first, vector<int>::iterator last, int init);
void accumulate_block(vector<int>::iterator first, vector<int>::iterator last, int& sum);
int main(void)
{
vector<int> ivec(100);
for (int i = 1; i <= 100; ++i)
ivec.push_back(i);
cout << parallel_accumulate(ivec.begin(),ivec.end(),0) << endl;
return 0;
}
int parallel_accumulate(vector<int>::iterator first, vector<int>::iterator last, int init)
{
const unsigned int length = distance(first, last);
if (!length)
return init;
const unsigned int min_per_thread = 25;
const unsigned int max_threads = (length + min_per_thread - 1) / min_per_thread;
const unsigned int hard_thread_num = thread::hardware_concurrency();
const unsigned int num_thread = min(hard_thread_num != 0 ? hard_thread_num : 2, max_threads);
const unsigned int block_size = length / num_thread;
vector<thread> threads(num_thread - 1);
vector<int> results(num_thread);
vector<int>::iterator block_start = first;
for (int i = 0; i < (num_thread - 1); i++)
{
vector<int>::iterator block_end = block_start;
advance(block_end, block_size);
threads[i] = thread(accumulate_block, block_start, block_end, ref(results[i]));
block_start = block_end;
}
accumulate_block(block_start, last, results[num_thread - 1]);
for (auto &r : threads)//auto遍历线程
r.join();
return accumulate(results.begin(), results.end(), init);
}
void accumulate_block(vector<int>::iterator first, vector<int>::iterator last, int& sum)
{
sum = accumulate(first, last, sum);
}
代码中使用了stl里面的容器来定义多个thread,thread是一个类,可以这样使用。主要难度再迭代器的应用上。需要反复阅读加深记忆。