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的机制,对于理解共享池的争用,意义巨大

2026四款AI原生IDE实测:Trae、Qoder、CodeBuddy、Cursor能力边界深度解析

AI原生IDE正从代码编辑器演进为开发者智能工作流中枢,其核心在于对上下文理解、AST编辑意图建模与多模态任务调度的工程化实现。区别于传统插件式AI辅助,真正的AI原生IDE需具备知识库嵌入、符号图索引、操作链固化等底层能力,从而支撑Figma转码、N+1查询修复、跨语言迁移等复杂场景。Trae强调中文语境与企业规范的强绑定,Qoder聚焦AST级编辑轨迹预测,CodeBuddy通过IDE/插件/CLI三态划分控制权边界,Cursor则以云端Agent实现开发任务的时空并行。本文基于真实项目压测,揭示免费版

ctk87443的博客 2466

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

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

weixin_33739541的博客 524

开源AI数字人DUIX:从零构建你的智能交互助手

本文详细介绍了如何利用开源AI数字人DUIX从零构建智能交互助手。文章阐述了DUIX作为开源项目的核心优势,包括低成本启动、低网络依赖和高度可定制性,并提供了从开发环境搭建、核心模块(AI模型、语音、形象)配置到个性化业务逻辑开发与最终部署的完整实践指南,帮助开发者快速掌握构建专属AI数字人的全流程。

weixin_29051811的博客 504

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

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

weixin_30907935的博客 412

《湖科大教书匠计算机网络》学习笔记总目录+思维导图

本篇文章是对《湖科大教书匠计算机网络》所有知识点的笔记总结归档和计算机网络的思维导图

weixin_73077810的博客 8252

微信聊天记录丢失原因与恢复方案详解

SQLite数据库作为移动应用常见的本地存储方案,其加密机制和存储结构直接影响数据安全性。以微信为例,聊天记录存储在EnMicroMsg.db等SQLite文件中,采用AES加密保护。当手机清理工具误删这些文件时,会导致特定时间段记录丢失。理解数据恢复原理需要掌握文件系统删除机制和闪存特性,其中关键点包括TRIM指令的影响和数据块覆盖风险。通过专业工具如DiskDigger或iMyFone D-Back,配合ADB调试和SQLite数据重组技术,可在黄金时间窗口内恢复记录。日常维护建议结合自动化备份方案和存

weixin_32612263的博客 386

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

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

weixin_33735077的博客 369

电力系统分析 | Matlab实现源荷场景生成---蒙特卡洛法场景生成启发式同步回带削减

电力系统分析 | Matlab实现源荷场景生成---蒙特卡洛法场景生成启发式同步回带削减

前程算法屋的博客 812

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

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

weixin_34050005的博客 345

华为OD机考双机位C卷 - 员工派遣 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 员工派遣 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1035

使用podspec创建iOS插件

概述 在WWDC 2014全球开发者大会上,苹果开放了动态库、App Extension等全新的功能,这为iOS插件化开发带来了可能。在iOS开发中,动态库是iOS提供的一种资源打包方式,可以将代码文件、头文件、资源文件和说明文档等集中在一起,并且可以在运行时进行动态加载。 目前,很多应用越做越复杂,应用程序也显得越来越臃肿。试想一下,如果将一些不常用的功能做成一个插件,然后根据用户的需求从网络中...

xiangzhihong8的专栏 992

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

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

weixin_34332905的博客 411

AI安全护栏评测:TrustedExecBench如何量化评估大模型防护能力

在人工智能和机器学习领域,模型安全对齐是确保AI系统可靠、可控的核心技术。其原理是通过设计安全机制(即“护栏”)来约束模型行为,防止生成有害、偏见或越界内容。这项技术的核心价值在于平衡AI能力与风险管控,是可信AI部署的基石。应用场景广泛覆盖内容审核、对话系统、代码生成等需要人机交互的领域。本文聚焦的TrustedExecBench项目,正是针对“护栏”性能量化评估这一痛点,提供了一个标准化、自动化的开源评测框架。该工具通过构建多维度的恶意测试套件,并引入基于模型的动态评判机制,能够系统性地检验大语言模型在

weixin_42525428的博客 378

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

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

350

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

weixin_34194087的博客 355

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值