1+ #include < cmath>
2+ #include < chrono>
3+ #include < iostream>
4+ #include < thread>
5+ #include < vector>
6+
7+ using namespace std ;
8+
9+ static const int MAX = 10e8 ;
10+
11+ static mutex gMutex ;
12+
13+ static double sum = 0 ;
14+
15+ void worker (int min, int max) {
16+ for (int i = min; i <= max; i++) {
17+ sum += sqrt (i);
18+ }
19+ }
20+
21+ void serial_task (int min, int max) {
22+ auto start_time = chrono::steady_clock::now ();
23+ sum = 0 ;
24+ worker (0 , MAX);
25+ auto end_time = chrono::steady_clock::now ();
26+ auto ms = chrono::duration_cast<chrono::milliseconds>(end_time - start_time).count ();
27+ cout << " Serail task finish, " << ms << " ms consumed, Result: " << sum << endl;
28+ }
29+
30+ void concurrent_worker (int min, int max) {
31+ {
32+ lock_guard guard (gMutex );
33+ cout << " Thread " << this_thread::get_id () << " work for [" << min << " , " << max << " ]" << endl;
34+ }
35+ double cur_sum = 0 ;
36+ for (int i = min; i <= max; i++) {
37+ cur_sum += sqrt (i);
38+ }
39+ {
40+ lock_guard guard (gMutex );
41+ sum += cur_sum;
42+ }
43+ }
44+
45+ void concurrent_task (int min, int max) {
46+ auto start_time = chrono::steady_clock::now ();
47+
48+ unsigned concurrent_count = thread::hardware_concurrency ();
49+ cout << " hardware_concurrency: " << concurrent_count << endl;
50+ vector<thread> threads;
51+ min = 0 ;
52+ sum = 0 ;
53+ for (int t = 0 ; t < concurrent_count; t++) {
54+ int range = max / concurrent_count * (t + 1 );
55+ threads.push_back (thread (concurrent_worker, min, range));
56+ min = range + 1 ;
57+ }
58+ for (int i = 0 ; i < threads.size (); i++) {
59+ threads[i].join ();
60+ }
61+
62+ auto end_time = chrono::steady_clock::now ();
63+ auto ms = chrono::duration_cast<chrono::milliseconds>(end_time - start_time).count ();
64+ cout << " Concurrent task finish, " << ms << " ms consumed, Result: " << sum << endl;
65+ }
66+
67+ int main () {
68+ serial_task (0 , MAX);
69+ concurrent_task (0 , MAX);
70+ return 0 ;
71+ }
0 commit comments