313 lines
24 KiB
HTML
313 lines
24 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_ref</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_atomic_atomic_ref 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_ref</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-atomic.html">atomic</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-atomic.html"><atomic></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><br />
|
|
<span class="kw1">struct</span> atomic_ref<span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(1)</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></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><br />
|
|
<span class="kw1">struct</span> atomic_ref<span class="sy1"><</span>T<span class="sy2">*</span><span class="sy1">></span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(2)</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><code>std::atomic_ref</code> 类模板应用原子操作到其所引用的对象。在 <code>atomic_ref</code> 对象的生存期中,认为其所引用的对象是原子对象。若一个线程写入原子对象,同时另一线程从它读取,则行为良好定义(数据竞争上的细节见<a href="cpp-language-memory_model.html">内存模型</a>)。另外,对原子对象的访问可以建立线程间同步,和按 <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order</a></span> 所指定排序非原子内存访问。</p>
|
|
<p>对象的生存期必须超出所有引用该对象的 <code>atomic_ref</code> 的生存期。任何 <code>atomic_ref</code> 实例引用存在的对象时,必须只通过这些 <code>atomic_ref</code> 实例排他地访问该对象。 <code>atomic_ref</code> 对象所引用对象的任何子对象均不可同时为任何其他 <code>atomic_ref</code> 对象所引用。</p>
|
|
<p>通过 <code>atomic_ref</code> 应用到对象的原子操作,相对于通过任何其他引用同一对象的 <code>atomic_ref</code> 应用的操作是原子的。</p>
|
|
<p><code>std::atomic_ref</code> 为<a href="cpp-named_req-CopyConstructible.html"><span style="font-style:italic">可复制构造</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(CopyConstructible)</span></a> 。</p>
|
|
<p>类似语言引用,常性对 <code>atomic_ref</code> 为浅——可通过 <code>const</code> <code>atomic_ref</code> 对象修改被引用的值。</p>
|
|
<h3><span class="mw-headline" id=".E7.89.B9.E5.8C.96">特化</span></h3>
|
|
<h4><span class="mw-headline" id=".E5.88.9D.E7.AD.89.E6.A8.A1.E6.9D.BF">初等模板</span></h4>
|
|
<p>初等 <code>std::atomic_ref</code> 模板可以用任何<a href="cpp-named_req-TriviallyCopyable.html"><span style="font-style:italic">可平凡复制</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(TriviallyCopyable)</span></a> 类型 <code>T</code> (包括 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span> )实例化:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">struct</span> Counters <span class="br0">{</span> <span class="kw4">int</span> a<span class="sy4">;</span> <span class="kw4">int</span> b<span class="sy4">;</span> <span class="br0">}</span> counter<span class="sy4">;</span> <span class="co1">// 用户定义的可平凡复制类型</span>
|
|
std<span class="sy4">::</span><span class="me2">atomic_ref</span><span class="sy1"><</span>Counters<span class="sy1">></span> cnt<span class="br0">(</span>counter<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 对用户定义类型的特化</span></pre></div>
|
|
</div>
|
|
<h4><span class="mw-headline" id=".E6.8C.87.E9.92.88.E7.B1.BB.E5.9E.8B.E7.9A.84.E9.83.A8.E5.88.86.E7.89.B9.E5.8C.96">指针类型的部分特化</span></h4>
|
|
<p>标准库提供 <code>std::atomic_ref</code> 模板对所有指针类型的部分特化。在对所有原子类型提供的操作外,这些特化额外支持适合指针类型的原子操作,如 <a href="cpp-atomic-atomic_ref-fetch_add.html"><code>fetch_add</code></a> 、 <a href="cpp-atomic-atomic_ref-fetch_sub.html"><code>fetch_sub</code></a> 。</p>
|
|
<h4><span class="mw-headline" id=".E6.95.B4.E6.95.B0.E7.B1.BB.E5.9E.8B.E7.9A.84.E7.89.B9.E5.8C.96">整数类型的特化</span></h4>
|
|
<p>以下列整数类型之一实例化时, <code>std::atomic_ref</code> 提供适合整数类型的原子操作,如 <a href="cpp-atomic-atomic_ref-fetch_add.html"><code>fetch_add</code></a> 、 <a href="cpp-atomic-atomic_ref-fetch_sub.html"><code>fetch_sub</code></a> 、 <a href="cpp-atomic-atomic_ref-fetch_and.html"><code>fetch_and</code></a> 、 <a href="cpp-atomic-atomic_ref-fetch_or.html"><code>fetch_or</code></a> 、 <a href="cpp-atomic-atomic_ref-fetch_xor.html"><code>fetch_xor</code></a> :</p>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>字符类型 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char</span></span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp">char8_t</span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char16_t</span></span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char32_t</span></span></span> 及 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">wchar_t</span></span></span> ;</li>
|
|
<li>标准有符号整数类型: <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">signed</span> <span class="kw4">char</span></span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">short</span></span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span></span></span> 及 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">long</span></span></span> ;</li>
|
|
<li>标准无符号整数类型: <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">char</span></span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">short</span></span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">int</span></span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span></span></span> 及 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span></span></span> ;</li>
|
|
<li>任何头文件 <a href="cpp-header-cstdint.html"><tt><cstdint></tt></a> 中的 typedef 所需的额外整数类型。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<p>定义有符号整数算术为使用补码;无未定义结果。</p>
|
|
<h4><span class="mw-headline" id=".E6.B5.AE.E7.82.B9.E7.B1.BB.E5.9E.8B.E7.9A.84.E7.89.B9.E5.8C.96">浮点类型的特化</span></h4>
|
|
<p>以浮点类型 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">float</span></span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">double</span></span></span> 和 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">double</span></span></span> 之一实例化时, <code>std::atomic_ref</code> 提供适合浮点类型的额外原子操作,如 <a href="cpp-atomic-atomic_ref-fetch_add.html"><code>fetch_add</code></a> 和 <a href="cpp-atomic-atomic_ref-fetch_sub.html"><code>fetch_sub</code></a> 。</p>
|
|
<p>没有操作导致未定义行为,即使结果不可以浮点类型表示。有影响的<a href="cpp-numeric-fenv.html">浮点环境</a>可能异于调用方线程的浮点环境。</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><i>见下方</i></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>difference_type</code></td>
|
|
<td><code>value_type</code> <span class="t-mark">(仅对于 <code>atomic_ref<<i>Integral</i>></code> 及 <code>atomic_ref<<i>Floating</i>></code> 特化)</span><br />
|
|
<span class="t-lc"><a href="cpp-types-ptrdiff_t.html">std::ptrdiff_t</a></span> <span class="t-mark">(仅对于 <code>atomic_ref<T*></code> 特化)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>对于每个 <code>std::atomic_ref<X></code> (无论是否特化), <code>std::atomic_ref<X>::value_type</code> 均为 <code>X</code> 。</p>
|
|
<p>初等 <code>atomic_ref</code> 模板中不定义 <code>difference_type</code> 。</p>
|
|
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E5.87.BD.E6.95.B0">成员函数</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div t-dsc-member-nobold-div">
|
|
<div><a href="cpp-atomic-atomic_ref-atomic_ref.html"><span class="t-lines"><span>(构造函数)</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>构造 <code>atomic_ref</code> 对象<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-operator=.html"><span class="t-lines"><span>operator=</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>存储值到 <code>atomic_ref</code> 对象所引用的对象中<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-is_lock_free.html"><span class="t-lines"><span>is_lock_free</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>检查该 <code>atomic_ref</code> 对象是否免锁<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-store.html"><span class="t-lines"><span>store</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>原子地以非原子参数替换被引用对象的值<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-load.html"><span class="t-lines"><span>load</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>原子地获得被引用对象的值<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-operator_T.html"><span class="t-lines"><span>operator T</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>从被引用对象加载值<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-exchange.html"><span class="t-lines"><span>exchange</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>原子地替换被引用对象的值并获得先前保有的值<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-compare_exchange.html"><span class="t-lines"><span>compare_exchange_weak</span><span>compare_exchange_strong</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>原子地与非原子参数比较被引用值,而若相等则进行原子交换,否则进行原子加载<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-wait.html"><span class="t-lines"><span>wait</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>阻塞线程直至被提醒且原子值更改<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-notify_one.html"><span class="t-lines"><span>notify_one</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>提醒至少一个在原子对象上的等待中阻塞的线程<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-notify_all.html"><span class="t-lines"><span>notify_all</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>提醒所有在原子对象上的等待中阻塞的线程<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<h3><span class="mw-headline" id=".E5.B8.B8.E9.87.8F">常量</span></h3>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-is_always_lock_free.html"><span class="t-lines"><span>is_always_lock_free</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-cmark">[静态]</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>指示该类型为始终免锁<br />
|
|
<span class="t-mark">(公开静态成员常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-required_alignment.html"><span class="t-lines"><span>required_alignment</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-cmark">[静态]</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>指示被 <code>atomic_ref</code> 引用所要求的对齐<br />
|
|
<span class="t-mark">(公开静态成员常量)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E7.89.B9.E5.8C.96.E7.9A.84.E6.88.90.E5.91.98.E5.87.BD.E6.95.B0">特化的成员函数</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-fetch_add.html"><span class="t-lines"><span>fetch_add</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>原子地将参数加到存储于被引用对象的值,并获得先前保有的值<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-fetch_sub.html"><span class="t-lines"><span>fetch_sub</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>原子地从存储于被引用对象的值减去参数,并获得先前保有的值<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-fetch_and.html"><span class="t-lines"><span>fetch_and</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>原子地在参数和被引用对象的值间进行逐位与,并获得先前保有的值<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-fetch_or.html"><span class="t-lines"><span>fetch_or</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>原子地在参数和被引用对象的值间进行逐位或,并获得先前保有的值<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-fetch_xor.html"><span class="t-lines"><span>fetch_xor</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>原子地在参数和被引用对象的值间进行逐位异或,并获得先前保有的值<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-operator_arith.html"><span class="t-lines"><span>operator++</span><span>operator++<span class="t-dsc-small">(int)</span></span><span>operator--</span><span>operator--<span class="t-dsc-small">(int)</span></span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>原子地将被引用对象增加或减少一<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-atomic-atomic_ref-operator_arith2.html"><span class="t-lines"><span>operator+=</span><span>operator-=</span><span>operator&=</span><span>operator|=</span><span>operator^=</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>原子地和被引用值加、减或者进行逐位与、或、异或<br />
|
|
<span class="t-mark">(公开成员函数)</span></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>
|