std:: atomic_ref
|
定义于头文件
<atomic>
|
||
|
template
<
class
T
>
struct atomic_ref ; |
(C++20 起) | |
std::atomic_ref
类模板对其引用的对象实施原子操作。
在
std::atomic_ref
对象的生命周期内,其引用的对象被视为原子对象。若一个线程写入原子对象的同时另一个线程读取该对象,其行为是明确定义的(有关数据竞争的详细信息请参阅
内存模型
)。此外,对原子对象的访问可以建立线程间同步,并按照
std::memory_order
的规定对非原子内存访问进行排序。
对象的生命周期必须超过所有引用该对象的
std::atomic_ref
的生命周期。当存在任何引用对象的
std::atomic_ref
实例时,必须仅通过这些
std::atomic_ref
实例访问该对象。被
std::atomic_ref
对象引用的对象的任何子对象,均不得被其他
std::atomic_ref
对象同时引用。
通过
std::atomic_ref
应用于对象的原子操作,与通过任何其他引用同一对象的
std::atomic_ref
所执行的原子操作之间具有原子性。
与核心语言中的
引用
类似,
std::atomic_ref
的常量性是浅层的——通过
const
std::atomic_ref
对象修改被引用值是可行的。
若满足以下任一条件,则程序非良构:
- std:: is_trivially_copyable_v < T > 为 false 。
-
is_always_lock_free为 false 且 std:: is_volatile_v < T > 为 true 。
std::atomic_ref
满足
可复制构造
要求。
目录 |
嵌套类型
| 类型 | 定义 |
value_type
|
std:: remove_cv_t < T > |
difference_type
|
|
数据成员
| 成员 | 描述 |
T
*
ptr
|
指向被引用对象的指针
( 仅用于说明的成员对象* ) |
|
[static]
|
指示该类型是否始终无锁
(公开静态成员常量) |
|
[static]
|
指示要被
atomic_ref
引用的对象所需的对齐方式
(公开静态成员常量) |
成员函数
构造
atomic_ref
对象
(公开成员函数) |
|
将值存储到
atomic_ref
对象引用的对象中
(公开成员函数) |
|
检查
atomic_ref
对象是否无锁
(公开成员函数) |
|
|
原子地以非原子参数替换被引用对象的值
(公开成员函数) |
|
|
原子地获取被引用对象的值
(公开成员函数) |
|
|
从被引用对象加载值
(公开成员函数) |
|
|
原子地替换被引用对象的值并获取先前持有的值
(公开成员函数) |
|
|
原子地比较被引用对象的值与非原子参数,相等时执行原子交换,不相等时执行原子加载
(公开成员函数) |
|
|
阻塞线程直至被通知且原子值发生变化
(公开成员函数) |
|
|
通知至少一个在原子对象上等待的线程
(公开成员函数) |
|
|
通知所有在原子对象上阻塞等待的线程
(公开成员函数) |
|
|
(C++26)
|
返回对象地址
(公开成员函数) |
仅当
|
|
|
原子地将参数加到存储在被引用对象中的值,并获取先前持有的值
(公开成员函数) |
|
|
原子地从存储在被引用对象中的值减去参数,并获取先前持有的值
(公开成员函数) |
|
|
原子地对被引用值进行加法或减法运算
(公开成员函数) |
|
仅当
|
|
|
(C++26)
|
原子地在参数与被引用对象的值之间执行
std::max
并获取先前持有的值
(公开成员函数) |
|
(C++26)
|
原子地在参数与被引用对象的值之间执行
std::min
并获取先前持有的值
(公开成员函数) |
|
原子地将被引用对象递增或递减一
(公开成员函数) |
|
仅当
|
|
|
原子地在参数与被引用对象的值之间执行按位与运算,并获取先前持有的值
(公开成员函数) |
|
| 原子地在参数与被引用对象的值之间执行按位或运算,并获取先前持有的值 | |
特化
标准规定
std::atomic_ref
具有以下特化版本:
|
template
<>
struct atomic_ref < /*integral-type*/ > ; |
(1) | (自 C++20 起) |
|
template
<>
struct atomic_ref < /*floating-point-type*/ > ; |
(2) | (自 C++20 起) |
|
template
<
class
/*pointer-type*/
>
requires
/* 见下文 */
|
(3) | (自 C++20 起) |
注释
实现可能会合并指定的特化。例如,MSVC STL 会将它们全部合并到主模板中。
当
T
是
cv
void
或函数类型时,
std
::
atomic_ref
<
T
*
>
(即
std
::
atomic_ref
<
void
*
>
、
std
::
atomic_ref
<
int
(
*
)
(
)
>
等)不具有
difference_type
或任何需要指针算术
或关系比较
(since C++26)
的操作。
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_atomic_ref
|
201806L
|
(C++20) |
std::atomic_ref
|
__cpp_lib_constexpr_atomic
|
202411L
|
(C++26) |
constexpr
std::atomic
and
std::atomic_ref
|
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| 缺陷报告 | 适用范围 | 发布时的行为 | 正确行为 |
|---|---|---|---|
|
LWG 3508
( P3323R1 ) |
C++20 |
atomic_ref
<
T
>
存在不可实现的操作
当
T
为
const
类型或指向非对象类型的指针时
|
针对不合适的
T
这些操作要么被约束要么不提供 |
参见
|
(C++11)
|
原子类模板及针对布尔、整型、
浮点型
(C++20 起)
和指针类型的特化
(类模板) |