C++0X(C++11)的std:mutex、std::thread与Windows API性能对比
来源:互联网 发布:风险模拟软件 编辑:程序博客网 时间:2024/06/05 09:40
转载处:http://aigo.iteye.com/blog/1908084
声明:请看到这篇文章的人务必去阅读原文,我转载的目的仅为了学习
C++0X标准提供的std::mutex和std::thread两个接口开发多线程同步的应用非常方便,而且可以跨平台,自己做了一下测试,发现这个跨平台的代价还是很大的,我分别用std::mutex与Windows的CRITICAL_SECTION、std::thead和WIndows的CreateThread接口做了对比,测试代码如下:
- #include "stdafx.h"
- #include <mutex>
- #include <atomic>
- #include <iostream>
- #include <time.h>
- #include <thread>
- #include <list>
- #include <atomic>
- #include <Windows.h>
- using namespace std;
- #define MAX_THREADS 16
- // 全局的结果数据
- long total1 = 0;
- long total2 = 0;
- std::atomic<long> total;
- std::mutex m_lock;
- CRITICAL_SECTION m_Lock2;
- void use_std_mutex();
- void use_win_critical();
- void use_win_thread();
- void test_mutex()
- {
- for(int i=0; i<1000000;++i)
- {
- m_lock.lock();
- total1 += 1;
- m_lock.unlock();
- }
- }
- void test_critical()
- {
- for(int i=0; i<1000000;++i)
- {
- EnterCriticalSection(&m_Lock2);
- total2 += 1;
- LeaveCriticalSection(&m_Lock2);
- }
- }
- int main(int argc, char* argv[])
- {
- use_std_mutex();
- use_win_critical();
- use_win_thread();
- return 0;
- }
- void use_std_mutex()
- {
- std::list<std::thread*> threadlist;
- //测试mutex
- printf("testing mutex...\n");
- clock_t start = clock();
- for(int i=0; i<MAX_THREADS; ++i)
- {
- std::thread *t1 = new std::thread((&test_mutex));
- threadlist.push_back(t1);
- }
- for(std::list<std::thread*>::const_iterator i = threadlist.begin(); i != threadlist.end(); i++ )
- {
- (*i)->join();
- }
- clock_t finish = clock();
- printf("result:%d\n", total1);
- printf("cost:%dms\n", finish - start);
- for(std::list<std::thread*>::const_iterator i = threadlist.begin(); i != threadlist.end(); i++ )
- {
- delete(*i);
- }
- }
- void use_win_critical()
- {
- //测试Critical
- InitializeCriticalSection(&m_Lock2);
- std::list<std::thread*> threadlist;
- printf("testing critical...\n");
- clock_t start = clock();
- for(int i=0; i<MAX_THREADS; ++i)
- {
- std::thread *t1 = new std::thread((&test_critical));
- threadlist.push_back(t1);
- }
- for(std::list<std::thread*>::const_iterator i = threadlist.begin(); i != threadlist.end(); i++ )
- {
- (*i)->join();
- }
- clock_t finish = clock();
- printf("result:%d\n", total2);
- printf("cost:%dms\n", finish - start);
- for(std::list<std::thread*>::const_iterator i = threadlist.begin(); i != threadlist.end(); i++ )
- {
- delete(*i);
- }
- }
- #define BUF_SIZE 255
- long total3 = 0;
- CRITICAL_SECTION m_Lock3;
- DWORD WINAPI MyThreadFunction( LPVOID lpParam );
- //使用Windows线程测试
- void use_win_thread()
- {
- DWORD dwThreadIdArray[MAX_THREADS];
- HANDLE hThreadArray[MAX_THREADS];
- InitializeCriticalSection(&m_Lock3);
- printf("testing use_win_thread...\n");
- clock_t start = clock();
- for( int i=0; i<MAX_THREADS; i++ )
- {
- hThreadArray[i] = CreateThread(
- NULL,
- 0,
- MyThreadFunction,
- 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 MyThreadFunction( LPVOID lpParam )
- {
- for(int i=0; i<1000000;++i)
- {
- EnterCriticalSection(&m_Lock3);
- total3 += 1;
- LeaveCriticalSection(&m_Lock3);
- }
- return 0;
- }
测试环境:
硬件:i7 2630qm 4核
系统:Windows7 64bit 旗舰版 SP1
程序:VS2012 Release win32
测试结果:
2线程抢占:
testing mutex... ---- result:2000000 ---- cost:628ms
testing critical... ---- result:2000000 ---- cost:132ms
testing use_win_thread... ---- result:2000000 ---- cost:98ms
4线程抢占:
testing mutex... ---- result:4000000 ---- cost:1150ms
testing critical... ---- result:4000000 ---- cost:266ms
testing use_win_thread... ---- result:4000000 ---- cost:216ms
8线程抢占:
testing mutex... ---- result:8000000 ---- cost:2855ms
testing critical... ---- result:8000000 ---- cost:582ms
testing use_win_thread... ---- result:8000000 ---- cost:461ms
16线程抢占:
testing mutex... ---- result:16000000 ---- cost:138052ms
testing critical... ---- result:16000000 ---- cost:1448ms
testing use_win_thread... ---- result:16000000 ---- cost:1169ms
结论:如果想追求高性能,C++11的std::mutex不要用,std::thread性能损耗不大,要用随意。
- C++0X(C++11)的std:mutex、std::thread与Windows API性能对比
- C++11 中std::thread和std::mutex的用法
- std::thread and std::mutex
- std::thread and std::mutex
- C++:线程(std::thread)
- pthread与std::thread对比用法
- c++11,cocos2d 3.x多线程std::thread demo
- std::mutex std::unique_lock std::lock_guard std::recursive_mutex的理解
- std::mutex的用法
- C++标准库 std::list 与 std::vector性能对比
- C++——多线程编程(一)std::thread
- C++ 11 的std::thread
- C++11中std::mutex的使用
- std::mutex 、std::lock_guard
- C++11(std::thread)
- std::Mutex
- std::mutex
- std mutex
- 网络请求
- Mysql性能优化一
- js获取model的值
- oracle IMP-00024: 只能指定一种模式 (TABLES, FROMUSER 或 FULL)
- React-native 环境搭建
- C++0X(C++11)的std:mutex、std::thread与Windows API性能对比
- ASP.NET-使用Alert事件导致页面错位的解决方法
- Qt实现滚动字幕效果
- 前端框架OnsenUI学习之页面结构介绍
- magento 获得产品所属分类
- AFNetworking 3.0迁移指南
- JAVA回调机制
- 【教程】七步精通Python机器学习
- Domain generalization 简介