`
aigo
  • 浏览: 2635767 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

C++0X(C++11)的std:mutex、std::thread与Windows API性能对比

c++ 
阅读更多

转载请注明原创出处: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差这么多。

 

0
1
分享到:
评论
1 楼 truekbcl 2013-07-17  
CS很可能会退化到mutex。就算不提这个,标准库可以任意实现,那是拼编译器。

相关推荐

    非常好的C++线程池项目资源,分享出来.zip

    较新做法,使用C++03语言规范,还有C++0x(特指std::function + std::bind),与上面不同的是采用 **基于对象的思路**,每一个任务都是一个std::function对象,std::function,std::bind真是好; ThreadPoolCpp11 ...

    VC10中的C++0x特性

    C++0x标准库包含了`&lt;thread&gt;`头文件,提供了对多线程编程的支持,如`std::thread`,`std::mutex`,`std::future`等,使得并行编程更加方便。 以上就是VC10中C++0x特性的一些主要方面。通过这些特性,开发人员可以...

    《The C++ Programming Language for C++0x》雏形(C++0x决议草案,源于C++之父网站主页)

    本书作为C++0x(后更名为C++11)标准特性介绍的权威资料,由C++之父Bjarne Stroustrup编写,是《The C++ Programming Language》第四版针对C++0x标准的早期版本。本书涵盖了C++0x中的三大主要改进领域:并发性...

    Overview of the New C++ (C++0x)

    C++0x增加了对多线程编程的支持,提供了一套线程库,包括`std::thread`类和相关的同步原语,如互斥量(mutex)、条件变量等,这使得在C++中编写安全、高效的并发程序变得更加容易。例如,创建一个线程: ```cpp ...

    C++0x标准资料收集

    C++0x,也被称为C++11,是C++编程语言的一个重要更新,它引入了许多新特性,改进了语言的效率、可读性和安全性。这个压缩包文件包含的资料无疑是学习和理解C++11新标准的重要资源。以下是一些关键的C++11知识点的...

    C++0x语言新特性一览

    C++11加入了对多线程编程的内置支持,包括`std::thread`,`std::mutex`,`std::lock_guard`等,简化了并发编程。 9. **类型 trait**: 类型trait允许在编译时获取类型的信息,如大小、对齐方式、是否为指针等,...

    深入应用C++11:代码优化与工程级应用

    《深入应用C++11:代码优化与工程级应用》这本书是针对C++11标准进行深入探讨的一部著作,旨在帮助开发者充分利用C++11的新特性,提升代码的效率和质量,实现更高效的工程级应用。C++11是C++语言的一个重要里程碑,...

    c++ reference.chm (包含0x标准新增内容)

    10. **并发编程支持**:C++11提供了`std::thread`、`std::mutex`、`std::future`等工具,为多线程编程提供了一套标准库支持,使开发者能够更好地利用多核处理器的优势。 以上仅是C++11标准中的一部分亮点,实际上还...

    c++ thread_local(csdn)————程序.pdf

    C++ 中的 Thread_Local 关键字是 C++11 引入的新特性,该关键字主要用于解决多线程环境下的资源竞争问题。在多线程环境下,如果多个线程访问同一个全局变量,可能会出现资源竞争的问题,导致性能下降。Thread_Local ...

    C++11标准(2012-01-16)

    7. **多线程支持**:C++11提供了一套内置的多线程API,包括`std::thread`、`std::mutex`、`std::lock_guard`等,使得在C++中编写多线程程序成为可能。 8. **动态内存管理改进**:增加了`std::unique_ptr`和`std::...

    The New C++

    10. **多线程支持(Thread Support Library)**:C++0x标准库添加了对多线程编程的支持,包括`std::thread`、`std::mutex`、`std::future`等,使得编写并发程序更加方便。 11. **统一的构造函数和拷贝构造函数**:...

    c++11FAQ中文版

    首先,C++11 FAQ中文版介绍了C++11的产生背景和一些相关问题,例如,C++11的正式名称是C++0x,后来由于一些原因,正式被命名为C++11。在这个部分中,我们可以了解到C++11成为正式标准的时间、C++11标准库文件的使用...

    C++ Concurrency in Action - Anthony Williams.pdf

    - **线程对象**:C++11引入了`std::thread`类,用于表示一个单独的线程。它可以用来创建和管理线程。 - **线程同步**:使用`std::mutex`互斥量来保护共享资源,避免数据竞争。 - **线程间通信**:通过`std::...

    C++11FAQ中文版pdf(带完整书签141页)

    5. **并发支持**:C++11增加了对多线程编程的支持,引入了std::thread、std::mutex、std::condition_variable等多线程库,使得并发编程更加安全和便捷。 6. **Lambda表达式**:Lambda表达式允许开发者直接在代码中...

    Rules of thumb for the design of C0x 英文

    C++0x(后来正式命名为C++11)是C++编程语言的一个重要版本,它引入了许多新特性、改进和优化,旨在提升语言的效率、安全性和可读性。Bjarne Stroustrup,作为C++的创始人,他在这篇论文中提出了设计C++0x的一些基本...

    [新C..标准:C..0x].(Overview.of.the.New.C..:C..0x).Scott.Meyers.文字版

    C++0x(后更名为C++11)是C++编程语言的一个重要版本,它引入了许多新的特性和改进,旨在提高开发效率、代码可读性和性能。Scott Meyers是一位著名的软件开发顾问,他在其文章中对C++0x的新特性进行了深入浅出的讲解...

    visual c++ 2008

    Visual C++ 2008引入了对C++11线程库的支持,如std::thread、std::mutex和std::condition_variable等,这使得在C++中进行并发编程变得更加方便。 内存管理是C++的一大特点,Visual C++ 2008提供了智能指针如std::...

    Visual.C++.2010开发权威指南].尹成.扫描版.zip

    6. **并发编程**:Visual C++ 2010强化了对多线程和并行计算的支持,书里可能讲解如何使用C++0x(现在的C++11)的新特性,如std::thread和std::mutex,进行并发编程。 7. **测试与调试**:书中应该会涉及单元测试、...

Global site tag (gtag.js) - Google Analytics