1+ #include < iostream>
2+ #include < thread>
3+ #include < algorithm>
4+ #include < numeric>
5+ #include < iterator>
6+ #include < vector>
7+
8+ template <typename ForwardIt>
9+ auto sum (ForwardIt first, ForwardIt last) {
10+ using value_type = std::iter_value_t <ForwardIt>;
11+ std::size_t num_threads = std::thread::hardware_concurrency ();
12+ std::ptrdiff_t distance = std::distance (first, last);
13+
14+ if (distance > 1024000 ) {
15+ // 计算每个线程处理的元素数量
16+ std::size_t chunk_size = distance / num_threads;
17+ std::size_t remainder = distance % num_threads;
18+
19+ // 存储每个线程的结果
20+ std::vector<value_type> results{ num_threads };
21+
22+ // 存储关联线程的线程对象
23+ std::vector<std::thread> threads;
24+
25+ // 创建并启动线程
26+ auto start = first;
27+ for (std::size_t i = 0 ; i < num_threads; ++i) {
28+ auto end = std::next (start, chunk_size + (i < remainder ? 1 : 0 ));
29+ threads.emplace_back ([start, end, &results, i] {
30+ results[i] = std::accumulate (start, end, value_type{});
31+ });
32+ start = end; // 开始迭代器不断向前
33+ }
34+
35+ // 等待所有线程执行完毕
36+ for (auto & thread : threads)
37+ thread.join ();
38+
39+ // 汇总线程的计算结果
40+ value_type total_sum = std::accumulate (results.begin (), results.end (), value_type{});
41+ return total_sum;
42+ }
43+
44+ value_type total_sum = std::accumulate (first, last, value_type{});
45+ return total_sum;
46+ }
47+
48+ int main () {
49+ std::vector<std::string> vecs{ " 1" ," 2" ," 3" ," 4" };
50+ auto result = sum (vecs.begin (), vecs.end ());
51+ std::cout << result << ' \n ' ;
52+
53+ vecs.clear ();
54+ for (std::size_t i = 0 ; i <= 1024001u ; ++i) {
55+ vecs.push_back (std::to_string (i));
56+ }
57+ result = sum (vecs.begin (), vecs.end ());
58+ std::cout << result << ' \n ' ;
59+ }
0 commit comments