std:: atomic <std::weak_ptr>
|
定义于头文件
<memory>
|
||
|
template
<
class
T
>
struct
std::
atomic
<
std::
weak_ptr
<
T
>>
;
|
(C++20 起) | |
针对 std:: weak_ptr < T > 的 std::atomic 部分模板特化允许用户以原子方式操作 weak_ptr 对象。
如果多个执行线程在无同步情况下访问同一个 std::weak_ptr 对象,且其中任意访问操作使用了 weak_ptr 的非const成员函数,则会发生数据竞争,除非所有此类访问都是通过 std:: atomic < std:: weak_ptr > 实例进行的。
关联的
use_count
递增保证是原子操作的一部分。关联的
use_count
递减在原子操作之后按序发生,但不要求作为其组成部分,除非在CAS操作失败时覆盖
expected
导致的
use_count
变更。所有关联的删除和释放操作都在原子更新步骤之后按序执行,且不属于原子操作组成部分。
请注意,由
std::weak_ptr
和
std::shared_ptr
使用的控制块是线程安全的:不同的非原子
std::weak_ptr
对象可以通过可变操作(例如
operator
=
或
reset
)被多个线程同时访问,即使这些实例是副本或在内部共享同一控制块。
类型
T
可能是不完整类型。
成员类型
| 成员类型 | 定义 |
value_type
|
std:: weak_ptr < T > |
成员函数
所有非特化的 std::atomic 函数也由此特化提供,且不包含额外成员函数。
atomic<weak_ptr<T>>:: atomic
|
constexpr
atomic
(
)
noexcept
=
default
;
|
(1) | |
|
atomic
(
std::
weak_ptr
<
T
>
desired
)
noexcept
;
|
(2) | |
|
atomic
(
const
atomic
&
)
=
delete
;
|
(3) | |
weak_ptr<T>
初始化为默认构造的值。
atomic<weak_ptr<T>>:: operator=
|
void
operator
=
(
const
atomic
&
)
=
delete
;
|
(1) | |
|
void
operator
=
(
std::
weak_ptr
<
T
>
desired
)
noexcept
;
|
(2) | |
atomic<weak_ptr<T>>:: is_lock_free
|
bool
is_lock_free
(
)
const
noexcept
;
|
||
若此类型所有对象的原子操作均为无锁操作则返回 true,否则返回 false。
atomic<weak_ptr<T>>:: store
|
void
store
(
std::
weak_ptr
<
T
>
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
||
以原子操作将
*
this
的值替换为
desired
的值,操作方式类似于
p.
swap
(
desired
)
,其中
p
是底层的
std::
weak_ptr
<
T
>
。内存顺序按照
order
排序。若
order
为
std::memory_order_consume
、
std::memory_order_acquire
或
std::memory_order_acq_rel
则行为未定义。
atomic<weak_ptr<T>>:: load
|
std::
weak_ptr
<
T
>
load
(
std::
memory_order
order
=
std::
memory_order_seq_cst
)
const
noexcept
;
|
||
以原子方式返回底层
std::
weak_ptr
<
T
>
的副本。内存顺序按照
order
排序。若
order
为
std::memory_order_release
或
std::memory_order_acq_rel
则行为未定义。
atomic<weak_ptr<T>>:: operator std::weak_ptr<T>
|
operator
std::
weak_ptr
<
T
>
(
)
const
noexcept
;
|
||
等价于 return load ( ) ; 。
atomic<weak_ptr<T>>:: exchange
|
std::
weak_ptr
<
T
>
exchange
(
std::
weak_ptr
<
T
>
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
||
以原子方式将底层的
std::
weak_ptr
<
T
>
替换为
desired
,操作方式类似于
p.
swap
(
desired
)
,其中
p
表示底层的
std::
weak_ptr
<
T
>
,并返回交换前
p
持有的值副本。内存顺序按照
order
参数指定。这是一个原子读-修改-写操作。
atomic<weak_ptr<T>>:: compare_exchange_weak, compare_exchange_strong
|
bool
compare_exchange_strong
(
std::
weak_ptr
<
T
>
&
expected,
std::
weak_ptr
<
T
>
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(1) | |
|
bool
compare_exchange_weak
(
std::
weak_ptr
<
T
>
&
expected,
std::
weak_ptr
<
T
>
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(2) | |
|
bool
compare_exchange_strong
(
std::
weak_ptr
<
T
>
&
expected,
std::
weak_ptr
<
T
>
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(3) | |
|
bool
compare_exchange_weak
(
std::
weak_ptr
<
T
>
&
expected,
std::
weak_ptr
<
T
>
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(4) | |
expected
相同且与其共享所有权,或若底层与
expected
均为空,则将
desired
赋值给底层
std::
weak_ptr
<
T
>
,返回
true
,并按
success
排序内存;否则将底层
std::
weak_ptr
<
T
>
赋值给
expected
,返回
false
,并按
failure
排序内存。若
failure
为
std::memory_order_release
或
std::memory_order_acq_rel
则行为未定义。成功时,该操作是对
*
this
的原子读-修改-写操作,且
expected
在原子更新后不会被访问。失败时,该操作是对
*
this
的原子加载操作,且
expected
会更新为从原子对象读取的现有值。对
expected
的 use_count 的更新属于此原子操作的一部分,尽管写入本身(及任何后续的释放/销毁)不要求是原子的。
fail_order
与
order
相同,但
std::memory_order_acq_rel
被替换为
std::memory_order_acquire
,且
std::memory_order_release
被替换为
std::memory_order_relaxed
。
fail_order
与
order
相同,但
std::memory_order_acq_rel
被替换为
std::memory_order_acquire
,且
std::memory_order_release
被替换为
std::memory_order_relaxed
。
atomic<weak_ptr<T>>:: wait
|
void
wait
(
std::
weak_ptr
<
T
>
old
std:: memory_order order = std:: memory_order_seq_cst ) const noexcept ; |
||
执行原子等待操作。
将
load
(
order
)
与
old
进行比较,如果两者等效则阻塞,直到
*
this
被
notify_one()
或
notify_all()
通知。此过程会重复直到
load
(
order
)
的值发生变化。即使底层实现出现伪唤醒,该函数也保证仅在值实际发生变化时才会返回。
内存顺序按照
order
参数确定。如果
order
是
std::memory_order_release
或
std::memory_order_acq_rel
,则行为未定义。
注意:两个 std::weak_ptr 在满足以下条件时被视为等效:它们存储相同的指针,并且要么共享所有权,要么都为空。
atomic<weak_ptr<T>>:: notify_one
|
void
notify_one
(
)
noexcept
;
|
||
执行原子通知操作。
如果在
*
this
上存在因原子等待操作(即
wait()
)而阻塞的线程,则解除至少一个此类线程的阻塞;否则不执行任何操作。
atomic<weak_ptr<T>>:: notify_all
|
void
notify_all
(
)
noexcept
;
|
||
执行原子通知操作。
解除所有在原子等待操作(即
wait()
)中阻塞的线程,这些线程正在等待
*
this
;如果没有阻塞线程则不执行任何操作。
成员常量
唯一的标准
std::atomic
成员常量
is_always_lock_free
也由此特化提供。
atomic<weak_ptr<T>>:: is_always_lock_free
|
static
constexpr
bool
is_always_lock_free
=
/*implementation-defined*/
;
|
||
示例
|
本节内容不完整
原因:缺少示例 |
参见
|
(C++11)
|
原子类模板及针对布尔型、整型、
浮点型
(C++20 起)
和指针类型的特化
(类模板) |