原子量

互斥量可以对于共享变量的访问进行加锁,可以保证对临界区的互斥访问,但加锁总是繁琐的,所以提供了更简单的共享变量保护访问的操作,原子量和原子操作。

原子量的构造

原子量包含在#include 中,对于基本类型,我们可以这样定义原子变量

    std::atomic_bool     abool;  std::atomic_int      aint;              std::atomic_uint     auint;          std::atomic_char     achar;          std::atomic_schar    aschar;         std::atomic_uchar    auchar;                std::atomic_short    ashort;

也可以使用atomic的模版定义

   std::atomic<int> aint;std::atomic<bool> abool;

原子变量不支持拷贝构造,move构造,赋值构造等。

std::atomic<int> aint=0;
std::atomic<int>  aint2= aint;//error
std::atomic<int>  aint3{std::move(aint)}//error
std::atomic<int>  aint4(aint)//error

简单用法

原子变量已经内部封装好各种操作,=,+=,++等等,可以像基本变量一样操作

#include <iostream>
#include <atomic>
#include <thread>
std::atomic<int> i=0;
void add()
{for (int j = 0; j < 100000; ++j)i++;
}
int main()
{//i.store(0);std::vector<std::thread> workers;for (int j = 0; j < 10; ++j)std::thread(add).detach();std::this_thread::sleep_for(std::chrono::microseconds(100000));std::cout <<  i << std::endl;system("pause");return 0;
}

当然atomic是一个模版,所以,也是可以用自定义类型的。比如

class test
{int a;int b;
};
std::atomic<test> i;

当然不是所有类都支持。

原子操作

自加操作

传入地址

LONG InterlockedIncrement(LONG  *pAddend);

自减操作

LONG InterlockedDecrement(LONG *pAddend);

增加/减某个值

LONG InterlockedExchangeAdd(LONG *pAddend, LONG Increment );

交换

 LONG InterlockedExchange( LPLONG Target, LONG Value );

比较交换

LONG InterlockedCompareExchange(
LPLONG Destination, LONG Exchange, LONG Comperand );

理解多线程(四)--原子量和原子操作相关推荐

  1. 深入理解多线程(五)—— Java虚拟机的锁优化技术

    本文是<深入理解多线程>的第五篇文章,前面几篇文章中我们从synchronized的实现原理开始,一直介绍到了Monitor的实现原理. 前情提要 通过前面几篇文章,我们已经知道: 1.同 ...

  2. (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上)

    目录 1.TCP四次挥手过程 2.挥手连环发问 专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三) ...

  3. 红黑树理解(四) 左旋

    红黑树理解 (一) 从2-3树到红黑树 红黑树理解(二)插入过程图解 红黑树理解(三)变色 红黑树理解(四)左旋 红黑树理解(五)右旋 左旋的目的是什么? 称以旋转节点为根节点的红黑树为T,左旋的目的 ...

  4. 本质安全设备标准(IEC60079-11)的理解(四)

    本质安全设备标准(IEC60079-11)的理解(四) 对于标准中"Separation"的理解 IEC60079-11使用了较长的篇幅来说明设计中需要考虑到的各种间距, 这也从一 ...

  5. C# 多线程四:互斥量Mutex的简单理解与运用

    目录 一. 特点: 1.非静态类继承 2.可以跨进程 二.构造函数 1.Mutex() 2.Mutex(Boolean) 2. Mutex(Boolean, String) 3.Mutex(Boole ...

  6. Java多线程(四)线程锁

    6.锁 由于多个线程是共同占有所属进程的资源和地址空间的,那么就会存在一个问题: 如果多个线程要同时访问某个资源,怎么处理? 在Java并发编程中,经常遇到多个线程访问同一个 共享资源 ,这时候作为开 ...

  7. iOS 从实际出发理解多线程

    前言 多线程很多开发者多多少少相信也都有了解,以前有些东西理解的不是很透,慢慢的积累之后,这方面的东西也需要自己好好的总结一下.多线程从我刚接触到iOS的时候就知道这玩意挺重要的,但那时也是能力有限, ...

  8. 多线程 空值线程数_【开发者成长】深入理解多线程编程

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 为什么要使用多线程? 防止并发编程出错最好的办法就是不写并发程序 既然多线程编程容易出错,为什么它 ...

  9. 秒杀多线程第三篇 原子操作 Interlocked系列函数

    上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是 ...

  10. 基于多线程并发-原子量实现自旋锁

    一.数据竞争的两种处理方式 多线程的核心是CPU的时间分片,同一时刻只能有一个线程获取到锁.对于没有获取到锁的线程通常有两种处理方式:自旋锁,没有获取到锁的线程会一直循环等待判断资源是否已经释放锁,不 ...

最新文章

  1. java 定时器获得外部参数_JMeter定时器使用小结
  2. Linux服务器安装软件
  3. 华为: 即将发布5G+VR的颠覆式智能眼镜
  4. 常用的6款Java开源报表制作工具
  5. 没有找到mysql。sock_linux系统安装mysql数据库
  6. C++:getenv setenv -- 获取设置系统环境变量
  7. mockito接口_什么是Mockito Extra接口?
  8. php识别字符编码,PHP自动识别字符集编码并完成转码_PHP教程
  9. 小汤学编程之JavaEE学习day10——Spring
  10. arduino 部分有用的函数
  11. 使用IDEA连接hbase数据库
  12. 统计相关系数(1)——Pearson(皮尔逊)相关系数及MATLAB实现
  13. IETester更新至最新版已经兼容Windows7(附下载地址及Debugbar插件)
  14. python头像教程_微信好友头像全家福详细教程python版
  15. 隧道安全管理八大系统
  16. Wannafly挑战赛24D-无限手套【dp】【数学】
  17. 国内无代码开发平台功能对比
  18. caffe的concat层
  19. (c语言)兔子繁衍问题
  20. autocad2016安装教程_CAD插件快速计算面积安装教程及资源链接

热门文章

  1. 变分法,欧拉-拉格朗日方程推导
  2. matlab 计算相关系数,如何用Matlab计算相关系数和偏相关系数
  3. 从“西点军校法则”学管理
  4. 粒子群算法python_用Python实现粒子群算法(PSO)
  5. C++ 7:深拷贝和浅拷贝,,值类型,构造函数和拷贝构造函数,函数重载,移动构造函数和移动赋值函数
  6. Verilog写一个对数计算模块Log2(x)
  7. 计算机软件429修复工具,运行时错误 429,ActiveX部件不能创建对象的解决方法小结...
  8. 组件上传之AspUpload使用方法
  9. tf1.x版RandLA-Net源码解读(5):测试
  10. 充电书库-study