c++ 11线程测试
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 }