386 lines
34 KiB
HTML
386 lines
34 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>std::atomic(std::weak_ptr)</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_memory_weak_ptr_atomic2 skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">std::</span>atomic<small>(std::weak_ptr)</small></h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-memory.html">memory</a>‎ | <a href="cpp-memory-weak_ptr.html">weak ptr</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dsc-header">
|
|
<td>
|
|
<div>定义于头文件 <code><a href="cpp-header-memory.html"><memory></a></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx20">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span> <span class="sy1"><</span><span class="kw1">class</span> T<span class="sy1">></span> <span class="kw1">struct</span> <a href="cpp-atomic-atomic.html"><span class="kw2066">std::<span class="me2">atomic</span></span></a><span class="sy1"><</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">>></span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><span class="t-lc"><a href="cpp-atomic-atomic.html">std::atomic</a></span> 对 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span></span></span> 的部分模板特化允许用户原子地操纵 weak_ptr 。</p>
|
|
<p>若多个执行线程访问同一 <span class="t-lc"><a href="cpp-memory-weak_ptr.html">std::weak_ptr</a></span> 对象而不同步,而任何这些访问使用 <span class="t-lc">weak_ptr</span> 的非 const 成员函数,则将出现数据竞争,除非所有这种访问都通过 <span class="t-lc">std::atomic<std::weak_ptr>></span> 的实例进行。</p>
|
|
<p>保证关联 use_count 的自增是原子操作的一部分。要求关联 use_count 的自减在原子操作之后,但不要求是其一部分,除非在覆写失败的 CAS 中的 <code>expected</code> 时 use_count 更改。任何关联删除和解分配后序于原子更新步骤,且不是原子操作的一部分。</p>
|
|
<p>注意 <span class="t-lc"><a href="cpp-memory-weak_ptr.html">std::weak_ptr</a></span> 和 <span class="t-lc"><a href="cpp-memory-shared_ptr.html">std::shared_ptr</a></span> 所用的控制块是线程安全的:多个线程能同时用可变操作,例如 operator= 或 reset ,访问不同的非原子 <span class="t-lc"><a href="cpp-memory-weak_ptr.html">std::weak_ptr</a></span> 对象,即使在这些实例互为副本,或因其他原因于内部共享同一控制块时。</p>
|
|
<p>类型 T 可为不完整类型。</p>
|
|
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E7.B1.BB.E5.9E.8B">成员类型</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-hitem">
|
|
<td>成员类型</td>
|
|
<td>定义</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>value_type</code></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span></span></span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E5.87.BD.E6.95.B0">成员函数</span></h3>
|
|
<p>此特化亦提供所有非特化 <span class="t-lc"><a href="cpp-atomic-atomic.html">std::atomic</a></span> 的成员函数,且不提供额外成员函数。</p>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="atomic.3Cweak_ptr.3CT.3E.3E::atomic"><span style="font-size:0.7em; line-height:130%">atomic<weak_ptr<T>>::</span>atomic</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">constexpr</span> atomic<span class="br0">(</span><span class="br0">)</span> <span class="kw1">noexcept</span> <span class="sy1">=</span> <span class="kw1">default</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(1)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp">atomic<span class="br0">(</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span> desired<span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(2)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp">atomic<span class="br0">(</span><span class="kw4">const</span> atomic<span class="sy3">&</span><span class="br0">)</span> <span class="sy1">=</span> delete<span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(3)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 初始化底层 <code>weak_ptr<T></code> 为默认构造值。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 初始化底层 <code>weak_ptr<T></code> 为 <code>desired</code> 的副本。同任何 <span class="t-lc"><a href="cpp-atomic-atomic.html">std::atomic</a></span> ,初始化不是原子操作。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 原子类型不可复制/移动构造。</div>
|
|
</div>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="atomic.3Cweak_ptr.3CT.3E.3E::operator.3D"><span style="font-size:0.7em; line-height:130%">atomic<weak_ptr<T>>::</span>operator=</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span> operator<span class="sy1">=</span><span class="br0">(</span><span class="kw4">const</span> atomic<span class="sy3">&</span><span class="br0">)</span> <span class="sy1">=</span> delete<span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(1)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span> operator<span class="sy1">=</span><span class="br0">(</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span> desired<span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(2)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 原子类型不可复制/移动赋值。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 值赋值,等价于 <span class="t-c"><span class="mw-geshi cpp source-cpp">store<span class="br0">(</span>desired<span class="br0">)</span></span></span></div>
|
|
</div>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="atomic.3Cweak_ptr.3CT.3E.3E::is_lock_free"><span style="font-size:0.7em; line-height:130%">atomic<weak_ptr<T>>::</span>is_lock_free</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> is_lock_free<span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>若此类型所有对象上的原子操作为无锁则返回 true ,否则返回 false 。</p>
|
|
</div>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="atomic.3Cweak_ptr.3CT.3E.3E::store"><span style="font-size:0.7em; line-height:130%">atomic<weak_ptr<T>>::</span>store</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span> store<span class="br0">(</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span> desired,<br />
|
|
<a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> order <span class="sy1">=</span> <a href="cpp-atomic-memory_order.html"><span class="kw2098">std::<span class="me2">memory_order_seq_cst</span></span></a><span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>如同用 <span class="t-c"><span class="mw-geshi cpp source-cpp">p.<span class="me1">swap</span><span class="br0">(</span>desired<span class="br0">)</span></span></span> ,原子地以 <code>desired</code> 的值替换 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> 的值,其中 <span class="t-c"><span class="mw-geshi cpp source-cpp">p</span></span> 为底层的 <span class="t-lc">std::weak_ptr<T></span> 。按照 <code>order</code> 排序内存。若 <code>order</code> 非 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_consume</a></span> 、 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acquire</a></span> 或 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acq_rel</a></span> 则行为未定义。</p>
|
|
</div>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="atomic.3Cweak_ptr.3CT.3E.3E::load"><span style="font-size:0.7em; line-height:130%">atomic<weak_ptr<T>>::</span>load</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span> load<span class="br0">(</span><a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> order <span class="sy1">=</span> <a href="cpp-atomic-memory_order.html"><span class="kw2098">std::<span class="me2">memory_order_seq_cst</span></span></a><span class="br0">)</span> <span class="kw4">const</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>原子地返回底层 <span class="t-lc">std::weak_ptr<T></span> 的副本。按照 <code>order</code> 排序内存。若 <code>order</code> 非 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_release</a></span> 或 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acq_rel</a></span> 则行为未定义。</p>
|
|
</div>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="atomic.3Cweak_ptr.3CT.3E.3E::operator_std::weak_ptr.3CT.3E"><span style="font-size:0.7em; line-height:130%">atomic<weak_ptr<T>>::</span>operator std::weak_ptr<T></span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">operator <a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>等价于 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">return</span> load<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span></span></span> 。</p>
|
|
</div>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="atomic.3Cweak_ptr.3CT.3E.3E::exchange"><span style="font-size:0.7em; line-height:130%">atomic<weak_ptr<T>>::</span>exchange</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span> exchange<span class="br0">(</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span> desired,<br />
|
|
<a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> order <span class="sy1">=</span> <a href="cpp-atomic-memory_order.html"><span class="kw2098">std::<span class="me2">memory_order_seq_cst</span></span></a><span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>如同用 <span class="t-c"><span class="mw-geshi cpp source-cpp">p.<span class="me1">swap</span><span class="br0">(</span>desired<span class="br0">)</span></span></span> ,原子地以 <code>desired</code> 替换底层 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span></span></span> ,其中 <span class="t-c"><span class="mw-geshi cpp source-cpp">p</span></span> 为底层 <span class="t-lc">std::weak_ptr<T></span> ,并返回 <span class="t-c"><span class="mw-geshi cpp source-cpp">p</span></span> 立即在交换前所拥有的值的副本。按照 <code>order</code> 排序内存。操作是原子读修改写操作。</p>
|
|
</div>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="atomic.3Cweak_ptr.3CT.3E.3E::compare_exchange_weak.2C_compare_exchange_strong"><span style="font-size:0.7em; line-height:130%">atomic<weak_ptr<T>>::</span>compare_exchange_weak, compare_exchange_strong</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> compare_exchange_strong<span class="br0">(</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy3">&</span> expected, <a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span> desired,<br />
|
|
<a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> success, <a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> failure<span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(1)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> compare_exchange_weak<span class="br0">(</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy3">&</span> expected, <a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span> desired,<br />
|
|
<a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> success, <a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> failure<span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(2)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> compare_exchange_strong<span class="br0">(</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy3">&</span> expected, <a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span> desired,<br />
|
|
<a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> order <span class="sy1">=</span> <a href="cpp-atomic-memory_order.html"><span class="kw2098">std::<span class="me2">memory_order_seq_cst</span></span></a><span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(3)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> compare_exchange_weak<span class="br0">(</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy3">&</span> expected, <a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span> desired,<br />
|
|
<a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> order <span class="sy1">=</span> <a href="cpp-atomic-memory_order.html"><span class="kw2098">std::<span class="me2">memory_order_seq_cst</span></span></a><span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(4)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 若底层 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span></span></span> 存储值与 <code>expected</code> 相同的指针,并与之共享所有权,或若底层指针和 <code>expected</code> 均为空,则从 <code>desired</code> 赋值给底层 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span></span></span> 并返回 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> ,按照 <code>success</code> 排序内存;否则从底层 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span></span></span> 赋值给 <code>expected</code> 并返回 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> ,按照 <code>failure</code> 排序内存。若 <code>failure</code> 为 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_release</a></span> 或 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acq_rel</a></span> 则行为未定义。成功时,操作为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> 上的原子读修改写操作,而在原子更新后不访问 <code>expected</code> 。失败时,操作是 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> 上的原子加载操作,并以读取自原子对象的既存值更新 <code>expected</code> 。这个对 <code>expected</code> 的 use_count 的更新是原子操作,尽管不要求写入自身(和任何后继的解分配/析构)是。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 同 <span class="t-v">(1)</span> ,但可能虚假地失败。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 等价于: <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">return</span> compare_exchange_strong<span class="br0">(</span>expected, desired, order, fail_order<span class="br0">)</span><span class="sy4">;</span></span></span> ,其中 <code>fail_order</code> 与 <code>order</code> 相同,除了 <span class="t-lc">std:memory_order_acq_rel</span> 被替换为 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acquire</a></span> ,而 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_release</a></span> 被替换为 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_relaxed</a></span> 。</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> 等价于: <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">return</span> compare_exchange_weak<span class="br0">(</span>expected, desired, order, fail_order<span class="br0">)</span><span class="sy4">;</span></span></span> ,其中 <code>fail_order</code> 与 <code>order</code> 相同,除了 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acq_rel</a></span> 被替换为 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acquire</a></span> ,而 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_release</a></span> 被替换为 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_relaxed</a></span> 。</div>
|
|
</div>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="atomic.3Cweak_ptr.3CT.3E.3E::wait"><span style="font-size:0.7em; line-height:130%">atomic<weak_ptr<T>>::</span>wait</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span> wait<span class="br0">(</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span> old<br />
|
|
<a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> order <span class="sy1">=</span> <a href="cpp-atomic-memory_order.html"><span class="kw2098">std::<span class="me2">memory_order_seq_cst</span></span></a><span class="br0">)</span> <span class="kw4">const</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>进行原子等待操作。</p>
|
|
<p>比较 <span class="t-c"><span class="mw-geshi cpp source-cpp">load<span class="br0">(</span>order<span class="br0">)</span></span></span> 与 <code>old</code> ,而若它们等价则阻塞直至 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> 被 <code>notify_one()</code> 或 <code>notify_all()</code> 提醒。重复此操作直至 <span class="t-c"><span class="mw-geshi cpp source-cpp">load<span class="br0">(</span>order<span class="br0">)</span></span></span> 更改。此函数保证仅若值更改才返回,即使底层实现虚假地除阻。</p>
|
|
<p>按照 <code>order</code> 排序内存。若 <code>order</code> 为 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_release</a></span> 或 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acq_rel</a></span> 则行为未定义。</p>
|
|
<p>注解:若二个 <code>weak_ptr</code> 存储同一指针,且要么共享所有权要么都为空,则它们等价。</p>
|
|
</div>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="atomic.3Cweak_ptr.3CT.3E.3E::notify_one"><span style="font-size:0.7em; line-height:130%">atomic<weak_ptr<T>>::</span>notify_one</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span> notify_one<span class="br0">(</span><span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>进行原子提醒操作。</p>
|
|
<p>若有一个线程在 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> 上的原子等待操作(即 <code>wait()</code> )中阻塞,则除阻至少一个这种线程,否则不做任何事。</p>
|
|
</div>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="atomic.3Cweak_ptr.3CT.3E.3E::notify_all"><span style="font-size:0.7em; line-height:130%">atomic<weak_ptr<T>>::</span>notify_all</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span> notify_all<span class="br0">(</span><span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>进行原子提醒操作。</p>
|
|
<p>除阻所有在 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> 上的原子等待操作(即 <code>wait()</code> )中阻塞的线程,若存在;否则不做任何事。</p>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E5.B8.B8.E9.87.8F">成员常量</span></h3>
|
|
<p>此特化亦提供唯一的标准 <span class="t-lc"><a href="cpp-atomic-atomic.html">std::atomic</a></span> 成员常量 <code>is_always_lock_free</code> 。</p>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="atomic.3Cweak_ptr.3CT.3E.3E::is_always_lock_free"><span style="font-size:0.7em; line-height:130%">atomic<weak_ptr<T>>::</span>is_always_lock_free</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">static</span> <span class="kw4">constexpr</span> <span class="kw4">bool</span> is_always_lock_free <span class="sy1">=</span> <span class="coMULTI">/*implementation-defined*/</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style="">
|
|
<tr>
|
|
<td class="mbox-empty-cell"></td>
|
|
<td class="mbox-text" style="">本节未完成<br />
|
|
原因:暂无示例</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic.html"><span class="t-lines"><span>atomic</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>atomic 类模板及其针对布尔、整型和指针类型的特化<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|