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
直接上代码:
#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
相关文章推荐
- 互斥对象锁和临界区锁性能比较(临界区效率更高,互斥可用于多进程的多线程中)
- 初学者浅谈“进程间通信的同步和互斥的比较简单的作用和用法”
- 互斥对象锁和临界区锁性能比较
- [zz]多线程中的 WaitForSingleObject 与 EnterCriticalSection 性能比较
- AjaxPanel自定义控件实现页面无刷新数据交互(做了个示例程序, 效果确实比较Cool, 用法非常简单! )(示例代码下载)
- 【windows--进程和线程】多线程编程(比较完整的简单介绍)
- php+mysql中存储过程性能简单比较
- python 多线程与多进程的简单测试比较
- 多线程互斥简单实例
- Centos或Windows中部署Zookeeper集群及其简单用法
- Linux与Windows线程机制简单比较
- [导入]AjaxPanel自定义控件实现页面无刷新数据交互(做了个示例程序, 效果确实比较Cool, 用法非常简单! )(示例代码下载)
- windows下多线程互斥量控制简单例子
- 互斥对象锁和临界区锁性能比较
- WCF 中 TCP 与 HTTP 性能简单比较
- windows网络编程(九)——IOCP+多线程实现简单的聊天(windows服务器端 windows客户端)
- 多核处理器&类UNIX系统 -> 之多进程和多线程性能比较
- 简单比较国内外主流浏览器的性能
- Windows下C++多线程同步与互斥简单运用
- Windows平台开启多线程简单示例(C++)