測試代碼:
struct test1 {
int value;
CRITICAL_SECTION _critical; //臨界區
test1() : value(0) {
// 初始化臨界區
InitializeCriticalSection(&_critical);
}
~test1() {
// 釋放臨界區
DeleteCriticalSection(&_critical);
}
void add() {
raii temp(&_critical);
++value;
}
void sub() {
raii temp(&_critical);
--value;
}
};
struct test2 {
int value;
test2() : value(0) {
}
~test2() {
}
void add() {
++value;
}
void sub() {
--value;
}
};
int main() {
auto timer = &time_heap::instance();
std::unordered_map<SOCKET, test1> t1; //客戶端信息
std::unordered_map<SOCKET, test2> t2; //客戶端信息
int num = 1000000;
for (int i = 0; i < num; ++i) {
t1[i] = *new test1;
t2[i] = *new test2;
}
auto _thread_pool = &thread_pool::instance();
auto start_time = timer->get_ms();
std::atomic<int> complete_num(0);
for (int i = 0; i < 5; ++i) {
_thread_pool->add([&] {
for (int j = 0; j < num; ++j) {
t1[j].add();
}
if (++complete_num == 10) {
printf("消耗時間(毫秒):%I64d\n", timer->get_ms() - start_time);
}
}
);
}
for (int i = 0; i < 5; ++i) {
_thread_pool->add([&] {
for (int j = 0; j < num; ++j) {
t1[j].sub();
}
if (++complete_num == 10) {
printf("消耗時間(毫秒):%I64d\n", timer->get_ms() - start_time);
}
}
);
}
//CRITICAL_SECTION _critical; //臨界區
//// 初始化臨界區
//InitializeCriticalSection(&_critical);
//for (int i = 0; i < 5; ++i) {
// _thread_pool->add([&] {
// for (int j = 0; j < num; ++j) {
// raii temp(&_critical);
// t2[j].add();
// }
// if (++complete_num == 10) {
// printf("消耗時間(毫秒):%I64d\n", timer->get_ms() - start_time);
// }
// }
// );
//}
//for (int i = 0; i < 5; ++i) {
// _thread_pool->add([&] {
// for (int j = 0; j < num; ++j) {
// raii temp(&_critical);
// t2[j].sub();
// }
// if (++complete_num == 10) {
// printf("消耗時間(毫秒):%I64d\n", timer->get_ms() - start_time);
// }
// }
// );
//}
}
裏面有我改寫的網絡上的線程池和一些其他的類,所以在各位的電腦上直接運行不了,如果想運行可以自己改一下。
單臨界區:
多臨界區:
耗時:
平均值相差5-6倍, 大家可以不用在意多個臨界區的開銷問題, 可以使用對象池解決開銷問題