多线程编程经常遇到数据同步问题,通常的做法就是加锁,之前个人常用临界区(CTITICAL_SECTION),最近开发高效率程序,寻求更高效的同步方式,才有了对原子锁的研究。经测试,原子锁效率确实比临界区高,用数据衡量,原子锁的效率是临界区的5倍左右。

测试方法:

1、主线程加锁

2、工作线程等待

3、主线程解锁

4、工作线程结束等待

测试结果:测试3、4步骤之间的耗时,临界区耗时5~6微秒,原子锁耗时1~2微秒。

关于临界区和原子锁,请baidu看看相关文章,这里不多介绍了。注意原子锁不能嵌套使用,否则会被锁死,临界区没这个问题。

包装了两个类分别实现临界区(CLock)和原子锁(CLockAtom),同时包装了两个在作用域中方便使用的类(CLockRegion和CLockAtomRegion),具体使用见下面代码。

CLock类

#include <windows.h>namespace UtilTool {class CLock{public:CLock(void){InitializeCriticalSection(&cs);}~CLock(void){DeleteCriticalSection(&cs);}inline void Lock(){EnterCriticalSection(&cs);}inline void UnLock(){LeaveCriticalSection(&cs);}private:CRITICAL_SECTION cs;};class CLockRegion{public:CLockRegion(CLock* lock) : m_lock(lock){m_lock->Lock();}~CLockRegion(){m_lock->UnLock();}private:CLock* m_lock;};
}

CLockAtom类

#include <windows.h>namespace UtilTool {struct _UTILTOOL_IMPORT_EXPORT_TYPE_ CAtom{public:CAtom(){m_l = 0;}volatile long* Get(){return &m_l;}private:volatile long m_l;};//原子锁//切忌嵌套使用class CLockAtom{public:CLockAtom(void){m_ics = 0;}~CLockAtom(void){}inline void Lock(){while (InterlockedExchange(&m_ics, 1) == 1){Sleep(0);}}inline void UnLock(){InterlockedExchange(&m_ics, 0);}static inline void Lock(CAtom* pAtom){while (InterlockedExchange(pAtom->Get(), 1) == 1){Sleep(0);}}static inline void UnLock(CAtom* pAtom){InterlockedExchange(pAtom->Get(), 0);}private:volatile long m_ics;};class CLockAtomRegion{public:CLockAtomRegion(CLockAtom* lock){m_atom = NULL;m_lock = lock;m_lock->Lock();}CLockAtomRegion(CAtom* atom){m_atom = atom;m_lock = NULL;CLockAtom::Lock(m_atom);}~CLockAtomRegion(){if (m_lock){m_lock->UnLock();}else if (m_atom){CLockAtom::UnLock(m_atom);}}private:CLockAtom* m_lock;CAtom* m_atom;};
}

CLockRegion的用法,CLockAtomRegion类似

CLock lock;void MyFunc()
{//进入函数,_lock被创建,调用CLockRegion构造函数,加锁CLockRegion _lock(&lock);//do something//函数退出,_lock被析构,解锁
}

C++多线程同步效率对比之临界区和原子锁相关推荐

  1. windows多线程同步--临界区

    推荐参考博客:秒杀多线程第五篇 经典线程同步 关键段CS 关于临界区的观念,一般操作系统书上面都有. 适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率比较 ...

  2. Java-多线程-Future、FutureTask、CompletionService、CompletableFuture解决多线程并发中归集问题的效率对比

    转载声明 本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容: [小家Java]Future.FutureTask.CompletionService.CompletableFut ...

  3. python和c运行速度的对比实验_Python中单线程、多线程和多进程的效率对比实验...

    原标题:Python中单线程.多线程和多进程的效率对比实验 文 | 饒木陽 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下 ...

  4. python io密集型应用案例-Python中单线程、多线程和多进程的效率对比实验实例

    python的多进程性能要明显优于多线程,因为cpython的GIL对性能做了约束. Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread ...

  5. python多线程图像识别_Python 多线程抓取图片效率对比

    目的: 是学习python 多线程的工作原理,及通过抓取400张图片这种IO密集型应用来查看多线程效率对比 import requests import urlparse import os impo ...

  6. 036-2018-1028 线程 效率对比 数据共享 同步锁死锁递归锁 守护线程 信号量

    笔记 昨日内容回顾: 队列:Queue 管道 : Pipe ,recv消息的时候 OSError,EOFError,数据不安全的 Manager : 共享数据 , 数据不安全 , 加锁 进程池 : P ...

  7. windows多线程同步互斥--总结

    2019独角兽企业重金招聘Python工程师标准>>> 秒杀多线程面试题系列 参考JustDoIT -- 大部分内容 <Windows核心编程>线程同步对象速查表 对象 ...

  8. 关于多线程同步与互斥

    原文:看我稳住「多线程」翻车的现场!_小林coding-CSDN博客 文章目录 前言 正文 竞争与协作 互斥的概念 同步的概念 互斥与同步的实现和使用 锁 信号量 生产者-消费者问题(互斥+同步) 经 ...

  9. Linux C++多线程同步的四种方式

    目录 一.互斥锁 二.条件变量 三.读写锁 原文链接:Linux C++多线程同步的四种方式(非常详细)_Y先森0.0-CSDN博客 背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通 ...

  10. C++多线程 互斥锁 信号量 事件 临界区

    一.互斥锁 1.先熟悉熟悉API 1,创建互斥锁,并反正一个句柄 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全 ...

最新文章

  1. react16 渲染流程
  2. python numpy使用
  3. matlab中bp网络盲分离代码,利用matlab实现语音盲分离
  4. 数字孪生营销_如何通过数字营销增加您的自由职业收入
  5. react 组件引用组件_React Elements VS React组件
  6. TikZ绘图示例——尺规作图: 圆内接正五边形的近似画法
  7. Java-Set、Map
  8. Win10下VB6.0开发之串口通信基础(一)控件属性篇
  9. ffplay的音视频同步分析
  10. IE兼容模式文件上传所遇问题解决
  11. Mycat快速入门(六): Mycat管理命令和监控
  12. 如何设计SaaS商业模式
  13. 利用Zeplin从设计图自动生成CSS,提高前端样式开发效率
  14. springboot发送邮件(QQ邮箱)
  15. 关于Echarts南丁格尔玫瑰图的部分解释
  16. 英雄榜 此服务器当前正在维护中,《天下3》2021年全新山海经版本“再战黄泉”震撼登场!——网易《天下3》官方网站...
  17. Quartz 使用(2.x版本)
  18. 禁止1200多种已知病毒的进程,做母盘必备!WINXP版
  19. 用Jupyter—Notebook爬取网页数据实例15(详讲selenium库)
  20. 信息学奥赛一本通c++版在线评测系统_OPPO Reno3 Pro评测:迄今为止最“性感”的5G手机...

热门文章

  1. 红色警戒2修改器原理百科(三)
  2. 【Excel2019(十二):Match与Index函数】【函数语法+与VLOOKUP比较+单元格引用原理+认识COLUMN函数+使用Match与VLOOKUP函数嵌套返回多列结果】
  3. linux分段内存管理中的GDT,LDT,GDTR,LDTR
  4. 图片轮换-jQuery
  5. android 设置启动画面,修改Android开机画面
  6. parallel循环java_使用Java8新特性parallelStream遇到的坑
  7. LIME-AI可解释模型:《“Why Should I Trust You?” Explaining the Predictions of Any Classifier》论文笔记
  8. 使用Navicat连接Oracle数据库教程
  9. 【立贴为证】二十年后2027,百度眼必然成人眼一个
  10. 2021-07-12淘宝首页首次尝试