116 lines
12 KiB
HTML
116 lines
12 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<T>::compare_exchange_weak, std::atomic_ref<T>::compare_exchange_strong</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_compare_exchange 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::atomic_ref<T>::</span>compare_exchange_weak, <span style="font-size:0.7em; line-height:130%">std::atomic_ref<T>::</span>compare_exchange_strong</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-atomic.html">atomic</a>‎ | <a href="cpp-atomic-atomic_ref.html">atomic ref</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-dcl t-since-cxx20">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> compare_exchange_weak<span class="br0">(</span> T<span class="sy3">&</span> expected, T desired,<br /></span>
|
|
<p> <a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> success,<br /></p>
|
|
<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="kw4">const</span> <span class="kw1">noexcept</span><span class="sy4">;</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="kw4">bool</span> compare_exchange_weak<span class="br0">(</span> T<span class="sy3">&</span> expected, T desired,<br /></span>
|
|
<p> <a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> order <span class="sy1">=</span><br /></p>
|
|
<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></div>
|
|
</td>
|
|
<td>(2)</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="kw4">bool</span> compare_exchange_strong<span class="br0">(</span> T<span class="sy3">&</span> expected, T desired,<br /></span>
|
|
<p> <a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> success,<br /></p>
|
|
<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="kw4">const</span> <span class="kw1">noexcept</span><span class="sy4">;</span></div>
|
|
</td>
|
|
<td>(3)</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="kw4">bool</span> compare_exchange_strong<span class="br0">(</span> T<span class="sy3">&</span> expected, T desired,<br /></span>
|
|
<p> <a href="cpp-atomic-memory_order.html"><span class="kw2092">std::<span class="me2">memory_order</span></span></a> order <span class="sy1">=</span><br /></p>
|
|
<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></div>
|
|
</td>
|
|
<td>(4)</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
</tbody>
|
|
<tbody>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>原子地比较被引用对象的<a href="cpp-language-object.html">值表示</a>与 <code>expected</code> 的值表示,而若它们逐位相等,则以 <code>desired</code> 替换前者(进行读修改写操作)。否则,加载存储于被引用对象的实际值到 <code>expected</code> 中(进行加载操作)。</p>
|
|
<p>读修改写和加载操作的内存模型分别是 <code>success</code> 和 <code>failure</code> 。在 (2) 和 (4) 版本中, <code>order</code> 同时用于读修改写操作和加载操作,除了若 <span class="t-c"><span class="mw-geshi cpp source-cpp">order <span class="sy1">==</span> <a href="cpp-atomic-memory_order.html"><span class="kw2097">std::<span class="me2">memory_order_acq_rel</span></span></a></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp">order <span class="sy1">==</span> <a href="cpp-atomic-memory_order.html"><span class="kw2096">std::<span class="me2">memory_order_release</span></span></a></span></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_relaxed</a></span> 用于加载操作。</p>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E6.95.B0">参数</span></h3>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td>expected</td>
|
|
<td>-</td>
|
|
<td>到期待在 <code>atomic_ref</code> 所引用对象中找到的值的引用</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>desired</td>
|
|
<td>-</td>
|
|
<td>若满足期待则要存储于被引用对象中的值</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>success</td>
|
|
<td>-</td>
|
|
<td>若比较成功则用于读修改写操作的内存同步顺序。容许所有值。</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>failure</td>
|
|
<td>-</td>
|
|
<td>若比较失败则用于加载操作的内存同步顺序。不能为 <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></td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>order</td>
|
|
<td>-</td>
|
|
<td>两个操作的内存同步顺序</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.BF.94.E5.9B.9E.E5.80.BC">返回值</span></h3>
|
|
<p>若成功更改被引用数据则为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> ,否则为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> 。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>比较和复制是逐位的(类似 <span class="t-lc"><a href="cpp-string-byte-memcmp.html">std::memcmp</a></span> 和 <span class="t-lc"><a href="cpp-string-byte-memcpy.html">std::memcpy</a></span> );不使用构造函数、赋值运算符或比较运算符。</p>
|
|
<p>允许弱形式 (1-2) 虚假地失败,即表现为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this <span class="sy3">!</span><span class="sy1">=</span> expected</span></span> ,即使它们相等。比较并交换在循环中时,弱版本在某些平台上将产生较好的性能。</p>
|
|
<p>弱比较并交换会要求循环,而强版本不会要求时,最好用强版本,除非 <code>T</code> 的对象表示可能包含陷阱位,或相同值有多种对象表示(例如浮点 NaN )。那些情况下,弱比较并交换通常能用,因为它在某些稳定的对象表示上快速收敛。</p>
|
|
<p>若有参与 union 某些成员,但非其他成员的值表示的位,则比较并交换可能始终失败,因为这种填充位在不参与活跃成员的值表示时拥有不确定值。</p>
|
|
<p>忽略决不参与对象值表示的填充位。</p>
|
|
<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>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|