atomic

每个 std::atomic 模板的实例化和全特化定义一个原子类型。若一个线程写入原子对象,同时另一线程从它读取,则行为良好定义。

另外,对原子对象的访问可以建立线程间同步,并按 std::memory_order 所对非原子内存访问定序。

std::atomic 既不可复制亦不可移动。

成员类型
value_type T (无论是否特化)
difference_type value_type (仅对 atomic<Integral> 和 atomic<Floating> (C++20 起) 特化)
std::ptrdiff_t (仅对 atomic<U*> 特化)
difference_type 不在初等 atomic 模板中,或不在对 std::shared_ptr 和 std::weak_ptr 的部分特化中定义。 成员函数
(构造函数) 构造原子对象(公开成员函数)
operator= 存储值于原子对象(公开成员函数)
is_lock_free 检查原子对象是否免锁(公开成员函数)
store 原子地以非原子对象替换原子对象的值(公开成员函数)
load 原子地获得原子对象的值(公开成员函数)
operator T 从原子对象加载值(公开成员函数)
exchange 原子地替换原子对象的值并获得它先前持有的值(公开成员函数)
compare_exchange_weak,compare_exchange_strong 原子地比较原子对象与非原子参数的值,若相等则进行交换,若不相等则进行加载(公开成员函数)
wait(C++20) 阻塞线程直至被提醒且原子值更改(公开成员函数)
notify_one(C++20) 提醒至少一个在原子对象上的等待中阻塞的线程(公开成员函数)
notify_all(C++20) 提醒所有在原子对象上的等待中阻塞的线程(公开成员函数)
常量
is_always_lock_free[静态](C++17) 指示该类型是否始终免锁(公开静态成员常量)
特化成员函数
fetch_add 原子地将参数加到存储于原子对象的值,并返回先前保有的值(公开成员函数)
fetch_sub 原子地从存储于原子对象的值减去参数,并获得先前保有的值(公开成员函数)
fetch_and 原子地进行参数和原子对象的值的逐位与,并获得先前保有的值(公开成员函数)
fetch_or 原子地进行参数和原子对象的值的逐位或,并获得先前保有的值(公开成员函数)
fetch_xor 原子地进行参数和原子对象的值的逐位异或,并获得先前保有的值(公开成员函数) 令原子值增加或减少一(公开成员函数)
operator++
operator++(int)
operator--
operator--(int) 加、减,或与原子值进行逐位与、或、异或(公开成员函数)
operator+=
operator-=
operator&=
operator|=
operator^=

atomic_flag

std::atomic_flag 是原子布尔类型。不同于所有 std::atomic 的特化,它保证是免锁的。不同于 std::atomic , std::atomic_flag 不提供加载或存储操作。

成员函数
(构造函数) 构造 atomic_flag(公开成员函数)
operator= 赋值运算符(公开成员函数)
clear 原子地设置标志为 false(公开成员函数)
test_and_set 原子地设置标志为 true 并获得其先前值(公开成员函数)
test(C++20) 原子地返回标志的值(公开成员函数)
wait(C++20) 阻塞线程直至被提醒且原子值更改(公开成员函数)
notify_one(C++20) 提醒至少一个在原子对象上的等待中阻塞的线程(公开成员函数)
notify_all (C++20) 提醒所有在原子对象上的等待中阻塞的线程
#include <thread>
#include <vector>
#include <iostream>
#include <atomic> std::atomic_flag lock = ATOMIC_FLAG_INIT; void f(int n)
{
for (int cnt = 0; cnt < 100; ++cnt) {
while (lock.test_and_set(std::memory_order_acquire)) // 获得锁
; // 自旋
std::cout << "Output from thread " << n << '\n';
lock.clear(std::memory_order_release); // 释放锁
}
} int main()
{
std::vector<std::thread> v;
for (int n = 0; n < 10; ++n) {
v.emplace_back(f, n);
}
for (auto& t : v) {
t.join();
}
}

输出:

Output from thread 2
Output from thread 6
Output from thread 7
...<exactly 1000 lines>...

C++ atomic的更多相关文章

  1. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  2. JUC学习笔记--Atomic原子类

    J.U.C 框架学习顺序 http://blog.csdn.net/chen7253886/article/details/52769111 Atomic 原子操作类包 Atomic包 主要是在多线程 ...

  3. 原子类java.util.concurrent.atomic.*原理分析

    原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...

  4. 【iOS atomic、nonatomic、assign、copy、retain、weak、strong】的定义和区别详解

    一.atomic与nonatomic 1.相同点 都是为对象添加get和set方法 2.不同点 atomic为get方法加了一把安全锁(及原子锁),使得方法get线程安全,执行效率慢 nonatomi ...

  5. OS中atomic的实现解析

    OS中atomic的实现解析 转自:http://my.oschina.net/majiage/blog/267409    摘要 atomic属性线程安全,会增加一定开销,但有些时候必须自定义ato ...

  6. Objective-c的@property(atomic,nonatomic,readonly,readwrite,assign,retain,copy,getter,setter) 属性特性

    assign:指定setter方法用简单的赋值,这是默认操作.你可以对标量类型(如int)使用这个属性.你可以想象一个float,它不是一个对象,所以它不能retain.copy. retain:指定 ...

  7. 为什么volatile不能保证原子性而Atomic可以?

    在上篇<非阻塞同步算法与CAS(Compare and Swap)无锁算法>中讲到在Java中long赋值不是原子操作,因为先写32位,再写后32位,分两步操作,而AtomicLong赋值 ...

  8. Objective-C 关键字:retain, assgin, copy, readonly,atomic,nonatomic

    声明式属性的使用:声明式属性叫编译期语法 @property(retain,nonatomic)Some *s; @property(参数一,参数二)Some *s; 参数1:retain:修饰引用( ...

  9. Java中的Atomic包

    Atomic包的作用 方便程序员在多线程环境下,无锁的进行原子操作 Atomic包核心 Atomic包里的类基本都是使用Unsafe实现的包装类,核心操作是CAS原子操作: 关于CAS compare ...

  10. 各种同步方法性能比较(synchronized,ReentrantLock,Atomic)

    synchronized: 在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合适的.原因在于,编译程序通常会尽可能的进行优化synchronize,另外可读性非常好,不 ...

随机推荐

  1. Array.forEach() 与 Array.map()这些方法的第三个可选参数 array 的作用

    说明 let thisArray = [] thisArray.forEach((item, index, array)=>{ //为什么要有array,而不是直接用thisArray? }) ...

  2. 阿里云 SMS 短信 Java SDK 封装

    Github & Issues: https://github.com/cn-src/aliyun-sms 官方文档:https://help.aliyun.com/document_deta ...

  3. __set_name__魔法方法

    介绍 __set_name__ 方法是 Python 3.6 中引入的一种特殊方法,它可以在类属性被赋值时自动调用.这个方法可以用来处理类属性的名称绑定问题,例如将类属性与其所在的类进行绑定. 具体来 ...

  4. pymysql基本语法,sql注入攻击,python操作pymysql,数据库导入导出及恢复数据---day38

    1.pymysql基本语法 # ### python操作mysql import pymysql ''' # ### 1.基本语法 #(1) 创建连接 host user password datab ...

  5. python如何多版本共存

    1. 先正常安装多个python版本,比如我电脑里面是安装的3.10以及3.12 2. 安装的时候建议不要选择系统盘,可以用两个目录安装,例如: d:\py310\... d:\py312\... 3 ...

  6. 教程|在矩池云使用 Stable Diffusion web UI v1.5 模型和 ControlNet 插件

    今天给大家介绍下如何在矩池云使用 Stable Diffusion web UI v1.5 模型和 Stable Diffusion ControlNet 插件. 租用机器 租用机器需要选择内存大于8 ...

  7. 【Azure 服务总线】Azure门户获取ARM模板,修改Service Bus的TLS版本

    问题描述 在Azure中创建Sverice Bus服务后,如果想修改服务的TLS版本,是否有办法呢? 问题解答 通过Service Bus的ARM模板,修改属性值中的 minimumTlsVersio ...

  8. 手把手带你认识GaussDB轻量化运维管理工具

    本文分享自华为云社区<GaussDB轻量化运维管理工具介绍>,作者: Gauss松鼠会小助手. 一.GaussDB 运维管理平台简介 开放生态层 友好Web界面,多云皮肤个性化定制 丰富的 ...

  9. npm install --legacy-peer-deps 安装出现依赖包冲突的解决方案

    npm install --legacy-peer-deps 安装出现依赖包冲突的解决方案 为什么 在安装依赖包的时候,会有依赖包的冲突 比如A包引用了C的1.0版本 B包依赖了C的1.1版本 win ...

  10. Navicat 通过 Http通道 连接远程 Mysql

    https://jingyan.baidu.com/article/3d69c551aa54dff0cf02d7a0.html 注意本机ip填写 localhost