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

C++ 实现Mutex(底层用win32) 和 C++中析构过程 和常量性的大坑 [Mutex参照链接(http://blog.youkuaiyun.com/jiangxinyu/article/details/7754573)class Mutex { public: Mutex() { _mutex = CreateMutex(NULL, FALSE, NULL); } ~Mutex() { CloseHandle( 阅读详情

转载处:http://aigo.iteye.com/blog/1908084

声明:请看到这篇文章的人务必去阅读原文,我转载的目的仅为了学习

C++0X标准提供的std::mutex和std::thread两个接口开发多线程同步的应用非常方便,而且可以跨平台,自己做了一下测试,发现这个跨平台的代价还是很大的,我分别用std::mutex与Windows的CRITICAL_SECTION、std::thead和WIndows的CreateThread接口做了对比,测试代码如下:

Cpp代码    收藏代码
  1. #include "stdafx.h"  
  2. #include <mutex>  
  3. #include <atomic>   
  4. #include <iostream>  
  5. #include <time.h>  
  6. #include <thread>  
  7. #include <list>  
  8. #include <atomic>   
  9. #include <Windows.h>  
  10.   
  11. using namespace std;  
  12.   
  13. #define MAX_THREADS 16  
  14.   
  15. // 全局的结果数据   
  16. long total1 = 0;   
  17. long total2 = 0;  
  18. std::atomic<long> total;  
  19.   
  20. std::mutex m_lock;  
  21.   
  22. CRITICAL_SECTION m_Lock2;  
  23.   
  24. void use_std_mutex();  
  25. void use_win_critical();  
  26. void use_win_thread();  
  27.   
  28.   
  29. void test_mutex()  
  30. {  
  31.     for(int i=0; i<1000000;++i)  
  32.     {  
  33.         m_lock.lock();  
  34.         total1 += 1;       
  35.         m_lock.unlock();  
  36.     }  
  37. }  
  38.   
  39. void test_critical()  
  40. {  
  41.     for(int i=0; i<1000000;++i)  
  42.     {  
  43.         EnterCriticalSection(&m_Lock2);  
  44.         total2 += 1;       
  45.         LeaveCriticalSection(&m_Lock2);  
  46.     }  
  47. }  
  48.   
  49. int main(int argc, char* argv[])  
  50. {  
  51.     use_std_mutex();  
  52.     use_win_critical();  
  53.     use_win_thread();  
  54.       
  55.     return 0;  
  56. }  
  57.   
  58. void use_std_mutex()  
  59. {  
  60.     std::list<std::thread*> threadlist;  
  61.   
  62.     //测试mutex  
  63.     printf("testing mutex...\n");  
  64.     clock_t start = clock();  
  65.     for(int i=0; i<MAX_THREADS; ++i)   
  66.     {  
  67.         std::thread *t1 = new std::thread((&test_mutex));  
  68.         threadlist.push_back(t1);  
  69.     }  
  70.     for(std::list<std::thread*>::const_iterator i = threadlist.begin(); i != threadlist.end(); i++ )  
  71.     {  
  72.         (*i)->join();  
  73.     }  
  74.     clock_t finish = clock();  
  75.     printf("result:%d\n", total1);  
  76.     printf("cost:%dms\n", finish - start);  
  77.     for(std::list<std::thread*>::const_iterator i = threadlist.begin(); i != threadlist.end(); i++ )  
  78.     {  
  79.         delete(*i);  
  80.     }  
  81. }  
  82.   
  83. void use_win_critical()  
  84. {  
  85.     //测试Critical  
  86.     InitializeCriticalSection(&m_Lock2);  
  87.     std::list<std::thread*> threadlist;  
  88.     printf("testing critical...\n");  
  89.     clock_t start = clock();  
  90.     for(int i=0; i<MAX_THREADS; ++i)   
  91.     {  
  92.         std::thread *t1 = new std::thread((&test_critical));  
  93.         threadlist.push_back(t1);  
  94.     }  
  95.     for(std::list<std::thread*>::const_iterator i = threadlist.begin(); i != threadlist.end(); i++ )  
  96.     {  
  97.         (*i)->join();  
  98.     }  
  99.     clock_t finish = clock();  
  100.     printf("result:%d\n", total2);  
  101.     printf("cost:%dms\n", finish - start);  
  102.     for(std::list<std::thread*>::const_iterator i = threadlist.begin(); i != threadlist.end(); i++ )  
  103.     {  
  104.         delete(*i);  
  105.     }  
  106. }  
  107.   
  108.   
  109. #define BUF_SIZE 255  
  110. long total3 = 0;   
  111. CRITICAL_SECTION m_Lock3;  
  112.   
  113. DWORD WINAPI MyThreadFunction( LPVOID lpParam );  
  114. //使用Windows线程测试  
  115. void use_win_thread()  
  116. {  
  117.     DWORD   dwThreadIdArray[MAX_THREADS];  
  118.     HANDLE  hThreadArray[MAX_THREADS];   
  119.   
  120.     InitializeCriticalSection(&m_Lock3);  
  121.     printf("testing use_win_thread...\n");  
  122.   
  123.     clock_t start = clock();  
  124.     for( int i=0; i<MAX_THREADS; i++ )  
  125.     {  
  126.         hThreadArray[i] = CreateThread(   
  127.             NULL,                     
  128.             0,                        
  129.             MyThreadFunction,         
  130.             NULL,                     
  131.             0,                        
  132.             &dwThreadIdArray[i]);     
  133.   
  134.     }   
  135.   
  136.     WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);  
  137.   
  138.     clock_t finish = clock();  
  139.     printf("result:%d\n", total3);  
  140.     printf("cost:%dms\n", finish - start);  
  141.   
  142.     for(int i=0; i<MAX_THREADS; i++)  
  143.     {  
  144.         CloseHandle(hThreadArray[i]);  
  145.     }  
  146.   
  147. }  
  148.   
  149. DWORD WINAPI MyThreadFunction( LPVOID lpParam )   
  150. {   
  151.     for(int i=0; i<1000000;++i)  
  152.     {  
  153.         EnterCriticalSection(&m_Lock3);  
  154.         total3 += 1;       
  155.         LeaveCriticalSection(&m_Lock3);  
  156.     }  
  157.     return 0;   
  158. }   

测试环境:
硬件: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++11多线程编程实战:从std::thread创建到线程池实现 并发编程是现代软件开发的核心技术之一,它通过同时执行多个任务来提升程序性能。其基本原理是利用操作系统提供的线程机制,在单个进程中创建多个执行流。从技术价值看,并发编程能充分利用多核CPU资源,解决I/O阻塞问题,提升系统吞吐量和响应速度,广泛应用于服务器开发、游戏引擎、数据处理和高频交易等场景。在C++领域,C++11标准引入的std::thread库统一了多线程编程接口,解决了平台兼容性问题。本文将深入解析std::thread的线程创建、参数传递、所有权转移等核心机制,并结合互斥锁、条件变量等同步原语, 阅读详情

相关推荐

C++11 std::thread 进阶指南:从核心机制到实战避坑

多线程编程是现代软件开发中提升程序性能、实现并发处理的核心技术。其基本原理在于允许一个程序中的多个执行流(线程)同时运行,共享进程资源,从而充分利用多核CPU的计算能力,提升吞吐量和响应速度。在C++领域,C++11标准引入的std::thread库,将操作系统原生的线程API进行了标准化封装,极大地提升了代码的可移植性和开发效率,其技术价值在于为C++并发编程提供了统一、面向对象的基础设施。理解std::thread的所有权与移动语义、joinable状态管理、参数传递机制以及线程同步,是编写高效、健壮并

weixin_30904593的博客 461

C++原子操作和互斥锁性能(速度)对比

执行时间是0.541秒,是耗时最短的,但是由于没有用互斥方法保护,所以临界资源n的值不正确(正确的值应该为0)。这是因为自增、自减操作不是原子的,编译得到的汇编指令可能会对应多条指令。可以看到耗时为:5.261秒,n的值为0。编写测试demo,开启两个线程,对全局变量n分别进行自增、自减操作,计算执行时间。所以对于基本类型的临界资源,我们进行访问时可以用原子操作代替互斥锁,来提高性能。执行时间最长,但也能保持临界资源n的值正确。先说结论:原子操作性能(速度)强于互斥锁,下面用例子进行说明。

崔杰城的博客 3872

C++多线程编程实战:从std::thread到线程安全设计

并发编程是现代软件开发中提升性能的核心技术,它允许多个任务同时执行,从而充分利用多核CPU的计算能力。其基本原理是通过创建多个执行流(线程)来并行处理任务,关键技术包括线程同步、互斥锁和原子操作。在C++工程实践中,掌握多线程技术能显著提升服务端数据处理、图形界面响应等场景的性能。本文聚焦于C++11引入的std::thread库,深入解析其线程生命周期管理、数据竞争防范以及条件变量等同步机制,并结合互斥锁与RAII守卫等实战技巧,帮助开发者规避死锁、数据竞争等常见陷阱,构建高效可靠的并发程序。

weixin_30847939的博客 325

win32多线程和C++11多线程对比

C++11的mutex和thread虽然使用更加方便快捷,具有跨平台的有点,但是效率相比较于win32的多线程,效率有了明显的降低,故优先考win32多线程。

pkx1993的博客 1321

C++多线程编程实战:从std::thread基础到同步机制与性能优化

并发编程是现代软件开发的核心概念,旨在通过同时执行多个任务来提升程序性能。其基本原理在于利用多核处理器或时间片轮转实现任务重叠执行。在C++中,std::thread作为C++11标准引入的官方线程库,提供了跨平台的线程创建与管理能力,是实现并发的关键技术。它的技术价值在于能够显著提升计算密集型任务(如图像处理、科学计算)和I/O密集型任务(如网络服务器)的吞吐量与响应速度。在实际应用场景中,开发者常面临数据竞争和死锁等挑战,这需要通过互斥锁(std::mutex)、条件变量(std::condition_

chuanzhuanxian8669的博客 364

C++11异步编程实战:std::async、packaged_task与promise/future详解

异步编程是现代软件开发中提升程序响应性和资源利用率的核心技术,其核心原理在于将耗时任务从主执行流中分离,允许程序在等待操作完成时继续执行其他工作。在C++中,C++11标准引入的<future>库为此提供了语言级别的支持,通过std::future对象作为异步操作结果的占位符,实现了任务与结果获取的解耦。这项技术的核心价值在于简化并发逻辑、充分利用多核CPU资源,并有效避免主线程阻塞,从而显著提升网络服务、文件I/O及图形界面等场景下的应用性能。本文聚焦于C++11异步编程的三种核心工具:std::asyn

weixin_30911451的博客 441

C++11并发与多线程笔记(12) windows临界区、其他各种mutex互斥量

C++ 多线程编程

Cxiao_mengxin的博客 260

C++11多线程之std::thread线程的启动和常用API

【代码】C++11多线程之std::thread。

十三阿哥的博客 1378

C++11 std::thread:从线程创建到同步原语的完整指南

并发编程是现代软件开发中提升程序性能的核心技术,它允许程序同时执行多个任务,从而充分利用多核处理器的计算能力。其基本原理是通过创建多个执行流(线程)来并行处理任务,关键技术包括线程生命周期管理、数据同步和通信机制。在C++11标准中,std::thread的引入为多线程编程带来了标准化和可移植性,它抽象了底层操作系统的线程接口,并与互斥量、条件变量等同步原语无缝集成,共同构成了安全高效的并发编程基础。这一技术价值在于显著提升了程序的响应速度和处理吞吐量,广泛应用于服务器后端的高并发处理、客户端程序的界面响应

372

图文并茂Mutex性能问题解析

图文并茂Mutex性能问题解析,理解Mutex的机制,对于理解共享池的争用,意义巨大

05、基于ALV表报实现复选框、全选、取消全选等功能

基于Function ALV实现复选框、全选及取消全选等功能

wo520yl1314的博客 2372

C++11并发编程实战:从std::thread到线程池的完整指南

并发编程是现代软件开发的核心技术,它允许多个任务同时执行,从而提升系统吞吐量和响应速度。其基本原理是通过线程、进程或协程实现并行计算,关键技术包括同步原语、原子操作和内存模型。在C++领域,C++11标准库引入的`<thread>`、`<atomic>`和`<condition_variable>`等组件,为开发者提供了统一、可移植的并发编程工具集,彻底改变了以往依赖平台特定API的局面。这些特性在构建高性能服务器、游戏引擎和金融交易系统等对并发有极致要求的场景中价值显著。本文聚焦于`std::thread

weixin_33739541的博客 524

QGIS三维地形可视化实战:从DEM数据到炫酷3D场景(附Qgis2threejs插件配置)

本文详细介绍了如何利用QGIS和Qgis2threejs插件,将DEM数据转化为交互式三维地形场景的完整工作流。核心内容包括DEM数据准备、坐标系选择(重点对比WGS 84与UTM的差异及影响)、插件核心参数配置、卫星影像与等高线叠加等进阶技巧,并提供了成果导出与常见问题解决方案,帮助用户高效创建可用于网页展示的炫酷3D可视化成果。

mqtt6iot的博客 875

C++11 std::thread 深度解析:从基础用法到底层原理与线程同步实战

多线程编程是现代软件开发中提升程序性能、实现并发处理的核心技术。其基本原理在于允许一个程序同时执行多个任务,从而充分利用多核CPU的计算能力,解决I/O阻塞、提升响应速度。在C++领域,自C++11标准引入的std::thread类,为开发者提供了标准、可移植的线程创建与管理能力,是构建高效并发程序的基础工具。理解其核心接口,如线程创建、参数传递规则、以及关键的join与detach生命周期管理,是编写健壮多线程代码的第一步。然而,仅创建线程是不够的,当多个线程需要访问共享数据时,必须引入同步机制来避免数据

weixin_30907935的博客 412

基于Simulink的双向DC-DC变换器在储能系统中的应用仿真

摘要:本文详细介绍了基于Simulink的双向DC-DC变换器在光伏储能系统中的仿真实现。主要内容包括:1)采用非隔离型双向Buck-Boost拓扑作为储能系统枢纽;2)针对750V直流微网中的20kWh锂电池接口场景进行建模;3)详细阐述双闭环控制器设计(电压外环+电流内环)、工作模式判断逻辑等关键步骤;4)通过仿真验证了系统在功率阶跃和模式切换下的性能。文章提供了完整的建模流程和控制方法,为储能系统接口设计提供了实用参考。

amy_mhd的博客 179

osgEarth 球上显示地形数据库

osgEarth 球上显示地形数据库 本文展示了一种由DSM和DEM得到Osgb工程,并在osgEarth球上显示的方法。其中DSM、DOM到Osgb工程的转换由VPB(VirtualPlanetBuilder)来实现,并采用Model图层将Osgb工程在球上显示。 本文主要解决一下问题: VPB编译 VPB生成地形 地形在球上显示 目录 1 前言 2 VPB编译与使用 3 地形在osgEarth球上显示 内容 1 前言 VirtualPlanetBuilder是一个开源代码工具,用于根据

CPWWHSU的博客 2436

C++多线程编程实战:从std::thread到线程池与避坑指南

并发编程是现代软件开发的核心概念,它允许程序同时执行多个任务,从而充分利用多核处理器的计算能力,提升程序的响应速度与吞吐量。其基本原理是通过创建多个执行流(线程)来并行处理任务,关键技术包括线程管理、同步与通信。在C++工程实践中,自C++11标准起,语言内置了强大的多线程库,为开发者提供了统一、跨平台的并发工具。掌握多线程技术对于开发高性能服务器、实时系统、游戏引擎及数据处理应用至关重要。本文将深入探讨C++多线程的核心机制,涵盖线程创建与管理、互斥锁与条件变量等同步原语,并针对数据竞争、死锁等常见陷阱提

weixin_33735077的博客 369

RAP 语义键:让 UUID 世界变得可读、可导航、可校验

RAP 语义键的核心价值与实现要点 语义键(Semantic Key)是 ABAP RAP 模型中连接技术实现与业务体验的关键设计:通过为实体指定一组业务可读的标识字段(如订单号、物料编码等),在保持技术主键(如UUID)不变的同时,显著提升用户界面的可读性和导航体验。 主要优势: 提升UI可读性:Fiori元素会突出显示语义键字段,帮助用户快速识别关键业务数据 改善导航体验:OData URL会使用可读的语义键而非技术ID,便于分享和排查问题 降低沟通成本:业务人员能准确引用有意义的业务标识而非技术ID

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 155

C++11多线程编程实战:从std::thread入门到线程池构建

并发编程是现代软件开发的核心技术之一,它通过允许多个任务同时执行来提升程序性能与响应能力。其基本原理是利用操作系统提供的线程机制,将单一进程划分为多个独立的执行流,从而实现并行处理。这项技术的核心价值在于能够有效解决界面卡顿、提升计算密集型任务效率,并优化I/O密集型应用的吞吐量。在实际应用中,多线程广泛用于网络服务器、图形界面、数据处理和科学计算等场景。本文聚焦C++11标准引入的std::thread,这是C++进行多线程开发的基石,它提供了统一、可移植的线程创建与管理接口。通过理解线程生命周期管理、数

weixin_34050005的博客 345

扩展卡尔曼滤波 (EKF, Extended Kalman Filter) 算法详解及案例分析

扩展卡尔曼滤波是一种用于估计非线性动态系统状态的递归算法。其目标是通过结合非线性系统模型和观测数据,估计系统的最优状态。

闲人编程的博客 2387

剪映自动化工具来了:AI帮你自动剪辑成片

🎬分享一个剪映自动化剪辑工具!AI 自动帮你完成从写文案、配音、加字幕、选音乐、上特效到最终导出的整套流程🎈

XiaoqiangClub的博客 858

C++多线程编程实战:从std::thread基础到线程同步与性能优化

并发编程是现代软件开发的核心技术之一,旨在充分利用多核CPU的计算能力,提升程序响应速度和吞吐量。其基本原理是通过创建多个执行线程,使程序能够同时处理多个任务。在C++中,自C++11标准引入的std::thread为线程管理提供了统一、可移植的现代接口,取代了传统的平台相关API,显著提升了开发效率和代码安全性。这项技术的核心价值在于解决单线程程序在处理复杂计算或高并发请求时的性能瓶颈。其典型应用场景包括高性能服务器、数据处理工具、游戏引擎以及任何需要并行执行任务的系统。本文将聚焦于C++多线程编程的实践

weixin_34332905的博客 411

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

深入解析C++ std::mutex源码:从futex到自旋锁的底层实现

在多线程编程中,互斥锁是协调共享资源访问、防止数据竞争的核心同步原语。其基本原理是通过原子操作和等待队列,确保同一时刻只有一个线程能进入临界区。现代操作系统的futex机制实现了用户态快速路径与内核态等待的高效协作,大幅降低了无竞争时的锁开销。这种设计在C++标准库的std::mutex中体现为适应性策略,结合了自旋等待与挂起唤醒,以平衡性能与资源消耗。理解mutex的底层实现,有助于开发者应对高并发场景下的性能瓶颈与死锁问题,并为锁的选型与调优提供理论依据。本文以Linux下GCC的libstdc++实现

350

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++11 std::thread 三种创建方式详解:函数指针、仿函数与Lambda

多线程编程是现代软件开发中提升程序性能的核心技术,它允许程序同时执行多个任务,从而充分利用多核CPU的计算能力。其基本原理是通过操作系统或语言运行时创建多个独立的执行流(线程),这些线程共享进程的内存空间,但拥有各自的栈和寄存器状态。在C++中,C++11标准引入的std::thread将多线程支持从平台相关的API提升为语言核心特性,极大地简化了并发编程,提升了代码的可移植性和可维护性。其技术价值在于提供了统一、类型安全的线程创建与管理接口,使得开发者能够更专注于业务逻辑而非底层平台细节。应用场景广泛,从

weixin_34194087的博客 355

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: Git使用教程
GnakIewiy
博客等级 码龄18年 7粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值