-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paththread_functor.cpp
40 lines (31 loc) · 1.13 KB
/
thread_functor.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <vector>
#include <thread>
#include <algorithm>
#include <cstdlib>
class AccumulatorFunctor {
public:
void operator() (const std::vector<int> &v, unsigned long long &acm, unsigned int beginIndex, unsigned int endIndex) {
acm = 0;
for (unsigned int i = beginIndex; i < endIndex; ++i) {
acm += v[i];
}
}
unsigned long long acm;
};
int main() {
std::vector<int> v(1024);
srand(time(nullptr));
std::generate(v.begin(), v.end(), [&v]() { return rand() % v.size(); } );
for_each(begin(v), end(v), [](int i) { std::cout << i << ' '; } );
AccumulatorFunctor accumulator1 = AccumulatorFunctor();
AccumulatorFunctor accumulator2 = AccumulatorFunctor();
std::thread t1(std::ref(accumulator1), std::ref(v), 0, v.size() / 2);
std::thread t2(std::ref(accumulator2), std::ref(v), v.size() / 2, v.size());
t1.join();
t2.join();
std::cout << "acm1: " << accumulator1.acm << std::endl;
std::cout << "acm2: " << accumulator2.acm << std::endl;
std::cout << "acm1 + acm2: " << accumulator1.acm + accumulator2.acm << std::endl;
return 0;
}