转载请注明原创出处: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性能损耗不大,要用随喜。
【2016-04-14更新】
刚刚用VS2015又测试了下,发现和三年前测试的结果天壤之别!!!
testing mutex...
result:16000000
cost:885ms
testing critical...
result:16000000
cost:5339ms
testing use_win_thread...
result:16000000
cost:6101ms
这次测试的硬件还是当年的硬件,只是操作系统换成了windows 10 pro x64,vs换成2015旗舰版。
vs2012是当年第一个较完善支持c++11的版本(vs2010连std::thread都没提供),莫非当时没来及优化编译器?
std::mutex完爆critical_section,但是为啥critical相对三年前的结果,为啥性能降低了这么多?感觉像是bug一样,微软自家独占的critical性能居然比std::mutex差这么多。
相关推荐
较新做法,使用C++03语言规范,还有C++0x(特指std::function + std::bind),与上面不同的是采用 **基于对象的思路**,每一个任务都是一个std::function对象,std::function,std::bind真是好; ThreadPoolCpp11 ...
C++0x标准库包含了`<thread>`头文件,提供了对多线程编程的支持,如`std::thread`,`std::mutex`,`std::future`等,使得并行编程更加方便。 以上就是VC10中C++0x特性的一些主要方面。通过这些特性,开发人员可以...
本书作为C++0x(后更名为C++11)标准特性介绍的权威资料,由C++之父Bjarne Stroustrup编写,是《The C++ Programming Language》第四版针对C++0x标准的早期版本。本书涵盖了C++0x中的三大主要改进领域:并发性...
C++0x增加了对多线程编程的支持,提供了一套线程库,包括`std::thread`类和相关的同步原语,如互斥量(mutex)、条件变量等,这使得在C++中编写安全、高效的并发程序变得更加容易。例如,创建一个线程: ```cpp ...
C++0x,也被称为C++11,是C++编程语言的一个重要更新,它引入了许多新特性,改进了语言的效率、可读性和安全性。这个压缩包文件包含的资料无疑是学习和理解C++11新标准的重要资源。以下是一些关键的C++11知识点的...
C++11加入了对多线程编程的内置支持,包括`std::thread`,`std::mutex`,`std::lock_guard`等,简化了并发编程。 9. **类型 trait**: 类型trait允许在编译时获取类型的信息,如大小、对齐方式、是否为指针等,...
《深入应用C++11:代码优化与工程级应用》这本书是针对C++11标准进行深入探讨的一部著作,旨在帮助开发者充分利用C++11的新特性,提升代码的效率和质量,实现更高效的工程级应用。C++11是C++语言的一个重要里程碑,...
10. **并发编程支持**:C++11提供了`std::thread`、`std::mutex`、`std::future`等工具,为多线程编程提供了一套标准库支持,使开发者能够更好地利用多核处理器的优势。 以上仅是C++11标准中的一部分亮点,实际上还...
C++ 中的 Thread_Local 关键字是 C++11 引入的新特性,该关键字主要用于解决多线程环境下的资源竞争问题。在多线程环境下,如果多个线程访问同一个全局变量,可能会出现资源竞争的问题,导致性能下降。Thread_Local ...
7. **多线程支持**:C++11提供了一套内置的多线程API,包括`std::thread`、`std::mutex`、`std::lock_guard`等,使得在C++中编写多线程程序成为可能。 8. **动态内存管理改进**:增加了`std::unique_ptr`和`std::...
10. **多线程支持(Thread Support Library)**:C++0x标准库添加了对多线程编程的支持,包括`std::thread`、`std::mutex`、`std::future`等,使得编写并发程序更加方便。 11. **统一的构造函数和拷贝构造函数**:...
首先,C++11 FAQ中文版介绍了C++11的产生背景和一些相关问题,例如,C++11的正式名称是C++0x,后来由于一些原因,正式被命名为C++11。在这个部分中,我们可以了解到C++11成为正式标准的时间、C++11标准库文件的使用...
- **线程对象**:C++11引入了`std::thread`类,用于表示一个单独的线程。它可以用来创建和管理线程。 - **线程同步**:使用`std::mutex`互斥量来保护共享资源,避免数据竞争。 - **线程间通信**:通过`std::...
5. **并发支持**:C++11增加了对多线程编程的支持,引入了std::thread、std::mutex、std::condition_variable等多线程库,使得并发编程更加安全和便捷。 6. **Lambda表达式**:Lambda表达式允许开发者直接在代码中...
C++0x(后来正式命名为C++11)是C++编程语言的一个重要版本,它引入了许多新特性、改进和优化,旨在提升语言的效率、安全性和可读性。Bjarne Stroustrup,作为C++的创始人,他在这篇论文中提出了设计C++0x的一些基本...
C++0x(后更名为C++11)是C++编程语言的一个重要版本,它引入了许多新的特性和改进,旨在提高开发效率、代码可读性和性能。Scott Meyers是一位著名的软件开发顾问,他在其文章中对C++0x的新特性进行了深入浅出的讲解...
Visual C++ 2008引入了对C++11线程库的支持,如std::thread、std::mutex和std::condition_variable等,这使得在C++中进行并发编程变得更加方便。 内存管理是C++的一大特点,Visual C++ 2008提供了智能指针如std::...
6. **并发编程**:Visual C++ 2010强化了对多线程和并行计算的支持,书里可能讲解如何使用C++0x(现在的C++11)的新特性,如std::thread和std::mutex,进行并发编程。 7. **测试与调试**:书中应该会涉及单元测试、...