std:: atomic_... <std::shared_ptr>
|
定义于头文件
<memory>
|
||
|
template
<
class
T
>
bool atomic_is_lock_free ( const std:: shared_ptr < T > * p ) ; |
(1) |
(C++11 起)
(C++20 中弃用) (C++26 中移除) |
|
template
<
class
T
>
std:: shared_ptr < T > atomic_load ( const std:: shared_ptr < T > * p ) ; |
(2) |
(C++11 起)
(C++20 中弃用) (C++26 中移除) |
|
template
<
class
T
>
std::
shared_ptr
<
T
>
atomic_load_explicit
|
(3) |
(C++11 起)
(C++20 中弃用) (C++26 中移除) |
|
template
<
class
T
>
void atomic_store ( std:: shared_ptr < T > * p, std:: shared_ptr < T > r ) ; |
(4) |
(C++11 起)
(C++20 中弃用) (C++26 中移除) |
|
template
<
class
T
>
void
atomic_store_explicit
|
(5) |
(C++11 起)
(C++20 中弃用) (C++26 中移除) |
|
template
<
class
T
>
std::
shared_ptr
<
T
>
atomic_exchange
|
(6) |
(C++11 起)
(C++20 中弃用) (C++26 中移除) |
|
template
<
class
T
>
std::
shared_ptr
<
T
>
atomic_exchange_explicit
|
(7) |
(C++11 起)
(C++20 中弃用) (C++26 中移除) |
|
template
<
class
T
>
bool
atomic_compare_exchange_weak
|
(8) |
(C++11 起)
(C++20 中弃用) (C++26 中移除) |
|
template
<
class
T
>
bool
atomic_compare_exchange_strong
|
(9) |
(C++11 起)
(C++20 中弃用) (C++26 中移除) |
|
template
<
class
T
>
bool
atomic_compare_exchange_strong_explicit
|
(10) |
(C++11 起)
(C++20 中弃用) (C++26 中移除) |
|
template
<
class
T
>
bool
atomic_compare_exchange_weak_explicit
|
如果多个执行线程在未同步的情况下访问同一个
std::shared_ptr
对象,且其中任意访问使用了
shared_ptr
的非const成员函数,则会出现数据竞争,除非所有此类访问均通过以下函数执行——这些函数是对应原子访问函数(
std::atomic_load
、
std::atomic_store
等)的重载版本。
请注意,
shared_ptr
的控制块是线程安全的:不同的
std::shared_ptr
对象可以通过可变操作(例如
operator
=
或
reset
)被多个线程同时访问,即使这些实例是副本,并且在内部共享相同的控制块。
( p, expected, desired, std:: memory_order_seq_cst ,
std:: memory_order_seq_cst ) .
( p, expected, desired, std:: memory_order_seq_cst ,
std:: memory_order_seq_cst ) .
- 若它们等价(存储相同指针值,且同时共享同一对象所有权或均为空),则使用 success 指定的内存顺序约束将 desired 赋值给 * p 并返回 true 。
- 若它们不等价,则使用 failure 指定的内存顺序约束将 * p 赋值给 * expected 并返回 false 。
atomic_compare_exchange_weak_explicit
可能虚假失败。
如果 p 是空指针,这些函数的行为均未定义。
目录 |
参数
| p, expected | - | 指向 std::shared_ptr 的指针 |
| r, desired | - | std::shared_ptr 对象 |
| mo, success, failure | - | 类型为 std::memory_order 的内存顺序选择器 |
异常
这些函数不会抛出异常。
返回值
注释
这些函数通常通过互斥锁实现,存储在一个全局哈希表中,其中指针值被用作键。
Concurrency TS
提供了原子智能指针类
atomic_shared_ptr
和
atomic_weak_ptr
,作为这些函数使用的替代方案。
|
这些函数已被弃用,推荐使用 std:: atomic < std:: shared_ptr > 和 std:: atomic < std:: weak_ptr > 模板特化版本替代。 |
(since C++20)
(until C++26) |
|
这些函数已被移除,推荐使用 std:: atomic < std:: shared_ptr > 和 std:: atomic < std:: weak_ptr > 模板特化版本替代。 |
(since C++26) |
示例
|
本节内容不完整
原因:缺少示例 |
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| 缺陷报告 | 适用标准 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 2172 | C++11 | expected 可能为空指针 | 此情况下行为未定义 |
| LWG 2980 | C++11 |
空
shared_ptr
始终不等价
|
存储相同指针值时等价 |
参见
|
(C++11)
|
检查原子类型的操作是否无锁
(函数模板) |
|
(C++11)
(C++11)
|
以原子方式用非原子参数替换原子对象的值
(函数模板) |
|
(C++11)
(C++11)
|
以原子方式获取存储在原子对象中的值
(函数模板) |
|
(C++11)
(C++11)
|
以原子方式用非原子参数替换原子对象的值并返回原子的旧值
(函数模板) |
|
以原子方式比较原子对象的值与非原子参数,若相等则执行原子交换,否则执行原子加载
(函数模板) |