5.2.7 原子操作的释放函数
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, exchange和compare/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::mutex 和 std::future<> 。所以,让我继续了解本章的真实意义:内存模型在并发方面的细节,如何使用原子操作同步数据和强制排序。
5.2.7 原子操作的释放函数相关推荐
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是 ...
- windows线程同步-原子操作-Interlocked系列函数(用户模式)
Interlocked系列函数用来保证原子访问. InterlockedExchangeAdd提供保证long类型的原子操作. InterlockedExchangeAdd64提供long long ...
- WaitForMultipleObjects函数及原子操作Interlocked系列函数
先说一说这一篇用到的多线程等待函数:如下 WaitForMultipleObjects(DWORD nCount,CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD ...
- 多线程笔记--原子操作Interlocked系列函数
前面写了一个多线程报数的功能,为了描述方便和代码简洁起见,只输出最后的报数结果来观察程序运行结果.这非常类似一个网站的客户访问统计,每个用户登录用一个线程模拟,线程运行时将一个表示计数的变量递增.程序 ...
- Linux-Level2-day03:内存映射及其分配释放函数brk/sbrk->mmap/munmap;系统调用过程详解;
七.内存 1.虚拟内存.物理内存 虚拟内存:地址空间,虚拟的存储区域,应用程序所访问的都是虚拟内存. 物理内存:存储空间,实际的存储区域,只有系统内核可以访问物理内存. 虚拟内存和物理内存之间存在对应 ...
- 全局变量中断原子操作_中断函数里改变一个全局变量的值,在主函数里却检测到未变化...
如题.下面是我的程序代码 /****************************************************************** 键盘扫描函数 使用CPU资源:PORT ...
- c++ 原子操作 赋值_5.2 C++中的原子操作和原子类型
5.2 C++中的原子操作和原子类型 原子操作 是个不可分割的操作. 在系统的所有线程中,你是不可能观察到原子操作完成了一半这种情况的: 它要么就是做了,要么就是没做,只有这两种可能. 如果从对象读取 ...
- FFmpeg 源码之分配与释放 AVPacket 常用函数
查看 packet.h 源码,可以看到一系列的 AVPacket 分配与释放函数.熟悉这些 API 有利于方便在不同场景下使用 AVPacket. 一.av_packet_alloc 分配一个 AVP ...
- delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同
我估摸着内存分配+释放是个基础函数,有些人可能没注意此类函数或细究,但我觉得还是弄明白的好. 介绍下面内存函数前,先说一下MM的一些过程,如不关心可忽略: TMemoryManager = recor ...
最新文章
- linux tmux离线安装,linux环境下安装tmux
- 初学数据结构--链表
- 红帽启动apache服务器_CentOS6.5环境下搭建Apache httpd服务器
- windows下捕获dump
- python epoll 并发_Python语言之python并发原理(阻塞、非阻塞、epoll)
- 回文自动机:从入门到只会打板
- P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】
- 集成框架比较– Spring集成,Mule ESB或Apache Camel
- php openssl做什么,php开启openssl的方法
- 2020国内互联网公司的开源项目及Github地址部分汇总
- MSSql ID自动增长删除数据重1开始
- 腾讯云linux配置服务器配置,centos7+腾讯云服务器搭建wordpress
- 小程序的开发框架MINA及小程序的启动机制
- 开发信模板之失联跟进样品篇
- word实现多级自动编号
- 黑马程序员Python教程的代码--植物大战僵尸游戏代码
- Android 批量修改文件格式/文件名的骚操作
- 四足机器人--嵌入式硬件设计
- python编写程序实现货币转换_使用Tkinter的Python实时货币转换器
- springboot2.3整合mybatis-plus3.3.2较为详细的教程