简介
测试Win32下Mutex以及CriticalSection的效率
方法
创建两个线程,同时在for循环里对一个全局变量Var
进行修改,并测量耗时。
代码
#pragma once
#include<Windows.h>
#include<cstdio>
#include<ctime>
#include<mutex>
namespace Test {
static int Var = 0;
static int LoopCnt = 10000;
using ThreadFunc = DWORD(*)(LPVOID);
//static auto milliseconds_now = clock;
long long milliseconds_now() {
static LARGE_INTEGER s_frequency;
static BOOL s_use_qpc = QueryPerformanceFrequency(&s_frequency);
if (s_use_qpc) {
LARGE_INTEGER now;
QueryPerformanceCounter(&now);
return (1000LL * now.QuadPart) / s_frequency.QuadPart;
}
else {
return GetTickCount();
}
}
static HANDLE GenThread(ThreadFunc Func,
LPDWORD ThreadID, int* Inc) {
return CreateThread(
NULL, // default security attributes
0, // use default stack size
Func, // thread function name
Inc, // argument to thread function
0, // use default creation flags
ThreadID); // returns the thread identifier
}
static DWORD AddFunc_NoSync(LPVOID Param) {
int Inc = *(int*)Param;
//int Inc = 1;
for (int i = 0; i < LoopCnt; i++) {
Var += Inc;
}
return 0;
}
static HANDLE ghMutex;
static DWORD AddFunc_WinMutex(LPVOID Param) {
int Inc = *(int*)Param;
for (int i = 0; i < LoopCnt; i++) {
auto dwWaitResult = WaitForSingleObject(
ghMutex, // handle to mutex
INFINITE); // no time-out interval
Var += Inc;
ReleaseMutex(ghMutex);
}
return 0;
}
static CRITICAL_SECTION CriticalSection;
static DWORD AddFunc_WinCritical(LPVOID Param) {
int Inc = *