您的位置:首页 > 其它

windows 下多线程互斥性能比较及简单用法

2017-07-31 17:56 316 查看
使用C++标准STL中的mutex互斥对象和window内核对象mutex、windows API CRITICAL_SECTION临界进行简单的性能比较。

直接上代码:

#include "stdafx.h"

#include "mutex"

#include "windows.h"

#define MAX_THREADS 2

std::mutex myMutex; //stl互斥对象

HANDLE h_mutex;     //Windows互斥对象

CRITICAL_SECTION m_csLock; //临界

long total1 = 0;

long total2 = 0;

long total3 = 0;

void use_stl_mutex();

void use_win_mutex();

void use_win_critical();

DWORD WINAPI test_stl_mutex(LPVOID lpParameter);

DWORD WINAPI test_win_mutex(LPVOID lpParameter);

DWORD WINAPI test_win_critical(LPVOID lpParameter);

int main()

{
use_stl_mutex();
use_win_mutex();
use_win_critical();
system("pause");

    return 0;

}

void use_stl_mutex()

{
DWORD   dwThreadIdArray[MAX_THREADS];
HANDLE  hThreadArray[MAX_THREADS];

printf("testing use_stl_mutex...\n");

clock_t start = clock();
for (int i = 0; i<MAX_THREADS; i++)
{
hThreadArray[i] = CreateThread(
NULL,
0,
test_stl_mutex,
NULL,
0,
&dwThreadIdArray[i]);

}

WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);

clock_t finish = clock();
printf("result:%d\n", total1);
printf("cost:%dms\n", finish - start);

for (int i = 0; i<MAX_THREADS; i++)
{
CloseHandle(hThreadArray[i]);
}

}

DWORD WINAPI test_stl_mutex(LPVOID lpParameter)

{
{
for (int i = 0; i<1000000; ++i)
{
myMutex.lock();
total1 += 1;
myMutex.unlock();
}
}
return 0;

}

void use_win_mutex()

{
DWORD   dwThreadIdArray[MAX_THREADS];
HANDLE  hThreadArray[MAX_THREADS];

printf("testing use_win_mutex...\n");
h_mutex = CreateMutex(NULL,FALSE,NULL);
clock_t start = clock();
for (int i = 0; i<MAX_THREADS; i++)
{
hThreadArray[i] = CreateThread(
NULL,
0,
test_win_mutex,
NULL,
0,
&dwThreadIdArray[i]);

}

WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);

clock_t finish = clock();
printf("result:%d\n", total2);
printf("cost:%dms\n", finish - start);

for (int i = 0; i<MAX_THREADS; i++)
{
CloseHandle(hThreadArray[i]);
}

}

DWORD WINAPI test_win_mutex(LPVOID lpParameter)

{
for (int i = 0; i<1000000; ++i)
{
DWORD dw = WaitForSingleObject(h_mutex, INFINITE);
if (dw == WAIT_OBJECT_0)
{
total2 += 1;
}
ReleaseMutex(h_mutex);

}
return 0;

}

void use_win_critical()

{
DWORD   dwThreadIdArray[MAX_THREADS];
HANDLE  hThreadArray[MAX_THREADS];

InitializeCriticalSection(&m_csLock);
printf("testing use_win_critical...\n");

clock_t start = clock();
for (int i = 0; i<MAX_THREADS; i++)
{
hThreadArray[i] = CreateThread(
NULL,
0,
test_win_critical,
NULL,
0,
&dwThreadIdArray[i]);

}

WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);

clock_t finish = clock();
printf("result:%d\n", total3);
printf("cost:%dms\n", finish - start);

for (int i = 0; i<MAX_THREADS; i++)
{
CloseHandle(hThreadArray[i]);
}

}

DWORD WINAPI test_win_critical(LPVOID lpParameter)

{

for (int i = 0; i<1000000; ++i)
{
EnterCriticalSection(&m_csLock);
total3 += 1;
LeaveCriticalSection(&m_csLock);
}
return 0;

}

测试结果:

windows内核对象Mutex最耗时,临界耗时最少。

测试环境:

windows 7 旗舰版 sp1 

编译环境:

vs2015
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: