1 #include <ctime>
2 #include <iostream>
3 #include <vector>
4 #include <thread>
5 #include <atomic>
6 #include <mutex>
7
8 #include <Windows.h>
9
10 #define SIZE 1000000
11
12 std::atomic<int> g_seq1;
13 int g_seq2;
14 int g_seq3;
15 int g_seq4;
16
17 std::atomic_flag af = ATOMIC_FLAG_INIT;
18 std::mutex mtx;
19
20 CRITICAL_SECTION g_criSec;
21
22 void ThreadFunc1(int id)
23 {//原子操作 220ms
24 for (int i = 0; i < SIZE; i++)
25 {
26 ++g_seq1;
27 }
28 }
29
30 void ThreadFunc2(int id)
31 {//atomic_flag
32 for (int i = 0; i < SIZE; i++)
33 {
34 while (af.test_and_set()) {}
35 ++g_seq2;
36 af.clear();
37 }
38 }
39
40 void ThreadFunc3(int id)
41 {//mutex 260
42 for (int i = 0; i < SIZE; i++)
43 {
44 mtx.lock();
45 ++g_seq3;
46 mtx.unlock();
47 }
48 }
49
50 void ThreadFunc4(int id)
51 {//CriticalSection
52 for (int i = 0; i < SIZE; i++)
53 {
54 EnterCriticalSection(&g_criSec);
55 ++g_seq3;
56 LeaveCriticalSection(&g_criSec);
57 }
58 }
59
60 void ThreadTest1();
61
62 void ThreadTest2();
63
64 void ThreadTest3();
65
66 void ThreadTest4();
67
68
69 int main()
70 {
71 InitializeCriticalSection(&g_criSec);
72
73 ThreadTest1();
74
75 ThreadTest2();
76
77 ThreadTest3();
78
79 ThreadTest4();
80
81 std::cout << std::endl;
82 system("pause");
83 }
84
85 /* Output:
86
87 ThreadTest1
88 duration=213
89 g_seq1=10000000
90
91 ThreadTest2
92 duration=5164
93 g_seq2=10000000
94
95 ThreadTest3
96 duration=254
97 g_seq3=10000000
98
99 ThreadTest4
100 duration=2379
101 g_seq4=0
102
103 */
104
105 void ThreadTest1()
106 {
107 time_t tm_start = clock();
108 time_t tm_now = 0;
109 std::vector<std::thread> vec;
110 for (int i = 0; i < 10; i++)
111 {
112 vec.push_back(std::thread(ThreadFunc1, i));
113 }
114 for (auto& t : vec)
115 {
116 t.join();
117 }
118 tm_now = clock();
119 std::cout << std::endl;
120 std::cout << __FUNCTION__ << std::endl;
121 std::cout << "duration=" << tm_now - tm_start << std::endl;
122 std::cout << "g_seq1=" << g_seq1 << std::endl;
123 }
124
125 void ThreadTest2()
126 {
127 time_t tm_start = clock();
128 time_t tm_now = 0;
129 std::vector<std::thread> vec;
130 for (int i = 0; i < 10; i++)
131 {
132 vec.push_back(std::thread(ThreadFunc2, i));
133 }
134 for (auto& t : vec)
135 {
136 t.join();
137 }
138 tm_now = clock();
139 std::cout << std::endl;
140 std::cout << __FUNCTION__ << std::endl;
141 std::cout << "duration=" << tm_now - tm_start << std::endl;
142 std::cout << "g_seq2=" << g_seq2 << std::endl;
143 }
144
145 void ThreadTest3()
146 {
147 time_t tm_start = clock();
148 time_t tm_now = 0;
149 std::vector<std::thread> vec;
150 for (int i = 0; i < 10; i++)
151 {
152 vec.push_back(std::thread(ThreadFunc3, i));
153 }
154 for (auto& t : vec)
155 {
156 t.join();
157 }
158 tm_now = clock();
159 std::cout << std::endl;
160 std::cout << __FUNCTION__ << std::endl;
161 std::cout << "duration=" << tm_now - tm_start << std::endl;
162 std::cout << "g_seq3=" << g_seq3 << std::endl;
163 }
164
165 void ThreadTest4()
166 {
167 time_t tm_start = clock();
168 time_t tm_now = 0;
169 std::vector<std::thread> vec;
170 for (int i = 0; i < 10; i++)
171 {
172 vec.push_back(std::thread(ThreadFunc4, i));
173 }
174 for (auto& t : vec)
175 {
176 t.join();
177 }
178 tm_now = clock();
179 std::cout << std::endl;
180 std::cout << __FUNCTION__ << std::endl;
181 std::cout << "duration=" << tm_now - tm_start << std::endl;
182 std::cout << "g_seq4=" << g_seq4 << std::endl;
183 }