5.2.7 原子操作的释放函数

直到现在,我都还没有去描述成员函数对原子类型操作的形式。但是,在不同的原子类型中 也有等价的非成员函数存在。大多数非成员函数的命名与对应成员函数有关,但是需 要“atomic_”作为前缀(比如,std::atomic_load() )。这些函数都会被不同的原子类型所重载。 在指定一个内存序列标签时,他们会分成两种:一种没有标签,另一种将“_explicit”作为后缀,并且需要一个额外的参数,或将内存顺序作为标签,亦或只有标签(例如,std::atomic_store(&atomic_var, new_value)std::atomic_store_explicit(&atomic_var, ne w_value, std::memory_order_release )。不过,原子对象被成员函数隐式引用,所有释放函数都 持有一个指向原子对象的指针(作为第一个参数)。

例如,std::atomic_is_lock_free()只有一种类型(虽然会被其他类型所重载),并且对于同一个对象a,  std::atomic_is_lock_free(&a) 返回值与a.is_lock_free()相同。同样的,std::atomic_load(&a)a.load()的作用一样,但需要注意的是,与a.load(std::memory_order_acquire)等价的操作是 std::atomic_load_explicit(&a, std::memory_order_acquire) 。

释放函数的设计是为了要与C语言兼容,在C中只能使用指针,而不能使用引用。例如, compare_exchange_weak()compare_exchange_strong()成员函数的第一个参数(期望值)是一个引用,而 std::atomic_compare_exchange_weak() (第一个参数是指向对象的指针)的第二个 参数是一个指针。 std::atomic_compare_exchange_weak_explicit() 也需要指定成功和失败的内 存序列,而“比较/交换”成员函数都有一个单内存序列形式(默认是std::memory_order_seq_cst ),重载函数可以分别获取成功和失败内存序列。

std::atomic_flag 的操作是“反潮流”的,在那些操作中它们“标志”的名称为: std::atomic_flag_test_and_set()std::atomic_flag_clear() ,但是以“_explicit”为后缀 的额外操作也能够指定内存顺序:std::atomic_flag_test_and_set_explicit() 和  std::atomic_flag_clear_explicit()

C++标准库也对在一个原子类型中的 std::shared_ptr<> 智能指针类型提供释放函数。这打破了“只有原子类型,才能提供原子操作”的原则,这里std::shared_ptr<> 肯定不是原子类型。 但是,C++标准委员会感觉对此提供额外的函数是很重要的。可使用的原子操作有:load,  store, exchangecompare/exchange,这些操作重载了标准原子类型的操作,并且获取一 个std::shared_ptr<>* 作为第一个参数:

std::shared_ptr<my_data> p;void process_global_data()
{std::shared_ptr<my_data> local = std::atomic_load(&p);process_data(local);
}void update_global_data()
{std::shared_ptr<my_data> local(new my_data);std::atomic_store(&p, local);
}

作为和原子操作一同使用的其他类型,也提供“_explicit”变量,允许你指定所需的内存顺序, 并且  std::atomic_is_lock_free() 函数可以用来确定实现是否使用锁,来保证原子性。

如之前的描述,标准原子类型不仅仅是为了避免数据竞争所造成的未定义操作,它们还允许 用户对不同线程上的操作进行强制排序。这种强制排序是数据保护和同步操作的基础,例 如,std::mutexstd::future<> 。所以,让我继续了解本章的真实意义:内存模型在并发方面的细节,如何使用原子操作同步数据和强制排序。

5.2.7 原子操作的释放函数相关推荐

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

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

  2. windows线程同步-原子操作-Interlocked系列函数(用户模式)

    Interlocked系列函数用来保证原子访问. InterlockedExchangeAdd提供保证long类型的原子操作. InterlockedExchangeAdd64提供long long ...

  3. WaitForMultipleObjects函数及原子操作Interlocked系列函数

    先说一说这一篇用到的多线程等待函数:如下 WaitForMultipleObjects(DWORD nCount,CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD ...

  4. 多线程笔记--原子操作Interlocked系列函数

    前面写了一个多线程报数的功能,为了描述方便和代码简洁起见,只输出最后的报数结果来观察程序运行结果.这非常类似一个网站的客户访问统计,每个用户登录用一个线程模拟,线程运行时将一个表示计数的变量递增.程序 ...

  5. Linux-Level2-day03:内存映射及其分配释放函数brk/sbrk->mmap/munmap;系统调用过程详解;

    七.内存 1.虚拟内存.物理内存 虚拟内存:地址空间,虚拟的存储区域,应用程序所访问的都是虚拟内存. 物理内存:存储空间,实际的存储区域,只有系统内核可以访问物理内存. 虚拟内存和物理内存之间存在对应 ...

  6. 全局变量中断原子操作_中断函数里改变一个全局变量的值,在主函数里却检测到未变化...

    如题.下面是我的程序代码 /****************************************************************** 键盘扫描函数 使用CPU资源:PORT ...

  7. c++ 原子操作 赋值_5.2 C++中的原子操作和原子类型

    5.2 C++中的原子操作和原子类型 原子操作 是个不可分割的操作. 在系统的所有线程中,你是不可能观察到原子操作完成了一半这种情况的: 它要么就是做了,要么就是没做,只有这两种可能. 如果从对象读取 ...

  8. FFmpeg 源码之分配与释放 AVPacket 常用函数

    查看 packet.h 源码,可以看到一系列的 AVPacket 分配与释放函数.熟悉这些 API 有利于方便在不同场景下使用 AVPacket. 一.av_packet_alloc 分配一个 AVP ...

  9. delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同

    我估摸着内存分配+释放是个基础函数,有些人可能没注意此类函数或细究,但我觉得还是弄明白的好. 介绍下面内存函数前,先说一下MM的一些过程,如不关心可忽略: TMemoryManager = recor ...

最新文章

  1. linux tmux离线安装,linux环境下安装tmux
  2. 初学数据结构--链表
  3. 红帽启动apache服务器_CentOS6.5环境下搭建Apache httpd服务器
  4. windows下捕获dump
  5. python epoll 并发_Python语言之python并发原理(阻塞、非阻塞、epoll)
  6. 回文自动机:从入门到只会打板
  7. P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】
  8. 集成框架比较– Spring集成,Mule ESB或Apache Camel
  9. php openssl做什么,php开启openssl的方法
  10. 2020国内互联网公司的开源项目及Github地址部分汇总
  11. MSSql ID自动增长删除数据重1开始
  12. 腾讯云linux配置服务器配置,centos7+腾讯云服务器搭建wordpress
  13. 小程序的开发框架MINA及小程序的启动机制
  14. 开发信模板之失联跟进样品篇
  15. word实现多级自动编号
  16. 黑马程序员Python教程的代码--植物大战僵尸游戏代码
  17. Android 批量修改文件格式/文件名的骚操作
  18. 四足机器人--嵌入式硬件设计
  19. python编写程序实现货币转换_使用Tkinter的Python实时货币转换器
  20. springboot2.3整合mybatis-plus3.3.2较为详细的教程

热门文章

  1. vue中进入详情页记住列表滚动位置keep-alive解决
  2. H5页面--Android滑动屏幕图片误触
  3. Confluence 6 嵌套用户组的示例
  4. 微机接口技术实用教程(第2版)-任向民,王克朝,宗明魁-课后答案
  5. 解决Win10中WerFault错误报告问题
  6. 大数据时代投资者应如何利用数据资源盈利
  7. Oracle RAC 11R2配置归档、删除策略,闪回配置完整版
  8. C代码工具--自动生成enum值和名字映射代码
  9. MYSQL 横向展示数据
  10. 类似web表单提交 使界面的滚动条 按要求定位到指定控件