Files
hustoj/web/cppreference-zh/chmhelp/cpp-memory-shared_ptr-atomic2.html
2025-08-01 12:57:54 +08:00

387 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::shared_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_shared_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::shared_ptr)</small></h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="cpp.html">cpp</a>&lrm; | <a href="cpp-memory.html">memory</a>&lrm; | <a href="cpp-memory-shared_ptr.html">shared 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>&#23450;&#20041;&#20110;&#22836;&#25991;&#20214; <code><a href="cpp-header-memory.html">&lt;memory&gt;</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">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</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">&lt;</span><a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;&gt;</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 &#36215;)</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> &#23545; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span></span></span> &#30340;&#37096;&#20998;&#27169;&#26495;&#29305;&#21270;&#20801;&#35768;&#29992;&#25143;&#21407;&#23376;&#22320;&#25805;&#32437; shared_ptr &#12290;</p>
<p>&#33509;&#22810;&#20010;&#25191;&#34892;&#32447;&#31243;&#21516;&#26102;&#35775;&#38382;&#21516;&#19968; <span class="t-lc"><a href="cpp-memory-shared_ptr.html">std::shared_ptr</a></span> &#23545;&#35937;&#32780;&#19981;&#21516;&#27493;&#65292;&#19988;&#20219;&#20309;&#36825;&#20123;&#35775;&#38382;&#20351;&#29992;&#20102; <span class="t-lc">shared_ptr</span> &#30340;&#38750; const &#25104;&#21592;&#20989;&#25968;&#65292;&#21017;&#23558;&#20986;&#29616;&#25968;&#25454;&#31454;&#20105;&#65292;&#38500;&#38750;&#36890;&#36807; <span class="t-lc">std::atomic&lt;std::shared_ptr&gt;&gt;</span> &#30340;&#23454;&#20363;&#36827;&#34892;&#25152;&#26377;&#35775;&#38382;&#65288;&#25110;&#36890;&#36807;&#20174; C++20 &#36215;&#24323;&#29992;&#30340;<a href="cpp-memory-shared_ptr-atomic.html">&#23396;&#31435;&#20989;&#25968;</a>&#23545; std::shared_ptr &#36827;&#34892;&#21407;&#23376;&#35775;&#38382;&#65289;&#12290;</p>
<p>&#20851;&#32852; use_count &#30340;&#33258;&#22686;&#20445;&#35777;&#26159;&#21407;&#23376;&#25805;&#20316;&#30340;&#19968;&#37096;&#20998;&#12290;&#20851;&#32852; use_count &#30340;&#33258;&#20943;&#21518;&#24207;&#20110;&#21407;&#23376;&#25805;&#20316;&#65292;&#20294;&#19981;&#35201;&#27714;&#26159;&#21407;&#23376;&#25805;&#20316;&#30340;&#19968;&#37096;&#20998;&#65292;&#38500;&#38750;&#22312;&#35206;&#20889;&#22833;&#36133;&#30340; CAS &#20013;&#30340; <code>expected</code> &#26102;&#65292; use_count &#26356;&#25913;&#12290;&#20219;&#20309;&#20851;&#32852;&#21024;&#38500;&#21644;&#35299;&#20998;&#37197;&#21518;&#24207;&#20110;&#21407;&#23376;&#26356;&#26032;&#27493;&#39588;&#65292;&#19988;&#19981;&#26159;&#21407;&#23376;&#25805;&#20316;&#30340;&#19968;&#37096;&#20998;&#12290;</p>
<p>&#27880;&#24847; shared_ptr &#30340;&#25511;&#21046;&#22359;&#26159;&#32447;&#31243;&#23433;&#20840;&#30340;&#65306;&#22810;&#20010;&#32447;&#31243;&#33021;&#21516;&#26102;&#29992;&#21487;&#21464;&#25805;&#20316;&#65292;&#20363;&#22914; operator= &#25110; reset &#65292;&#35775;&#38382;&#19981;&#21516;&#30340;&#38750;&#21407;&#23376; <span class="t-lc"><a href="cpp-memory-shared_ptr.html">std::shared_ptr</a></span> &#23545;&#35937;&#65292;&#21363;&#20351;&#36825;&#20123;&#23454;&#20363;&#20114;&#20026;&#21103;&#26412;&#65292;&#20110;&#20869;&#37096;&#20849;&#20139;&#21516;&#19968;&#25511;&#21046;&#22359;&#12290;</p>
<p>&#31867;&#22411; T &#21487;&#20026;&#19981;&#23436;&#25972;&#31867;&#22411;&#12290;</p>
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E7.B1.BB.E5.9E.8B">&#25104;&#21592;&#31867;&#22411;</span></h3>
<table class="t-dsc-begin">
<tr class="t-dsc-hitem">
<td>&#25104;&#21592;&#31867;&#22411;</td>
<td>&#23450;&#20041;</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-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span></span></span></td>
</tr>
</table>
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E5.87.BD.E6.95.B0">&#25104;&#21592;&#20989;&#25968;</span></h3>
<p>&#27492;&#29305;&#21270;&#25552;&#20379;&#25152;&#26377;&#38750;&#29305;&#21270;&#30340; <span class="t-lc"><a href="cpp-atomic-atomic.html">std::atomic</a></span> &#30340;&#25104;&#21592;&#20989;&#25968;&#65292;&#19981;&#25552;&#20379;&#38468;&#21152;&#25104;&#21592;&#20989;&#25968;&#12290;</p>
<p><br /></p>
<div class="t-member">
<h2><span class="mw-headline" id="atomic.3Cshared_ptr.3CT.3E.3E::atomic"><span style="font-size:0.7em; line-height:130%">atomic&lt;shared_ptr&lt;T&gt;&gt;::</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-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</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">&amp;</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> &#21021;&#22987;&#21270;&#24213;&#23618; <code>shared_ptr&lt;T&gt;</code> &#20026;&#40664;&#35748;&#26500;&#36896;&#20540;</div>
<div class="t-li1"><span class="t-li">2)</span> &#21021;&#22987;&#21270;&#24213;&#23618; <code>shared_ptr&lt;T&gt;</code> &#20026; <code>desired</code> &#30340;&#21103;&#26412;&#12290;&#21516;&#20219;&#20309; <span class="t-lc"><a href="cpp-atomic-atomic.html">std::atomic</a></span> &#31867;&#22411;&#65292;&#21021;&#22987;&#21270;&#19981;&#26159;&#21407;&#23376;&#25805;&#20316;&#12290;</div>
<div class="t-li1"><span class="t-li">3)</span> &#21407;&#23376;&#31867;&#22411;&#19981;&#21487;&#22797;&#21046;/&#31227;&#21160;&#26500;&#36896;&#12290;</div>
</div>
<div class="t-member">
<h2><span class="mw-headline" id="atomic.3Cshared_ptr.3CT.3E.3E::operator.3D"><span style="font-size:0.7em; line-height:130%">atomic&lt;shared_ptr&lt;T&gt;&gt;::</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">&amp;</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-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</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> &#21407;&#23376;&#31867;&#22411;&#19981;&#21487;&#22797;&#21046;/&#31227;&#21160;&#26500;&#36896;</div>
<div class="t-li1"><span class="t-li">2)</span> &#20540;&#36171;&#20540;&#65292;&#31561;&#20215;&#20110; <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.3Cshared_ptr.3CT.3E.3E::is_lock_free"><span style="font-size:0.7em; line-height:130%">atomic&lt;shared_ptr&lt;T&gt;&gt;::</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>&#33509;&#27492;&#31867;&#22411;&#25152;&#26377;&#23545;&#35937;&#19978;&#30340;&#21407;&#23376;&#25805;&#20316;&#20026;&#20813;&#38145;&#21017;&#36820;&#22238; true &#65292;&#21542;&#21017;&#36820;&#22238; false &#12290;</p>
</div>
<div class="t-member">
<h2><span class="mw-headline" id="atomic.3Cshared_ptr.3CT.3E.3E::store"><span style="font-size:0.7em; line-height:130%">atomic&lt;shared_ptr&lt;T&gt;&gt;::</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-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> desired,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<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>&#22914;&#21516;&#29992; <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> &#65292;&#21407;&#23376;&#22320;&#20197; <code>desired</code> &#30340;&#20540;&#26367;&#25442; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> &#30340;&#20540;&#65292;&#20854;&#20013; <span class="t-c"><span class="mw-geshi cpp source-cpp">p</span></span> &#26159;&#24213;&#23618;&#30340; <span class="t-lc">std::shared_ptr&lt;T&gt;</span> &#12290;&#25353;&#29031; <code>order</code> &#25490;&#24207;&#20869;&#23384;&#12290;&#33509; <code>order</code> &#38750; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_consume</a></span> &#12289; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acquire</a></span> &#25110; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acq_rel</a></span> &#21017;&#34892;&#20026;&#26410;&#23450;&#20041;&#12290;</p>
</div>
<div class="t-member">
<h2><span class="mw-headline" id="atomic.3Cshared_ptr.3CT.3E.3E::load"><span style="font-size:0.7em; line-height:130%">atomic&lt;shared_ptr&lt;T&gt;&gt;::</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-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</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>&#21407;&#23376;&#22320;&#36820;&#22238;&#24213;&#23618;&#20849;&#20139;&#25351;&#38024;&#30340;&#21103;&#26412;&#12290;&#25353;&#29031; <code>order</code> &#25490;&#24207;&#20869;&#23384;&#12290;&#33509; <code>order</code> &#19981;&#26159; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_release</a></span> &#25110; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acq_rel</a></span> &#21017;&#34892;&#20026;&#26410;&#23450;&#20041;&#12290;</p>
</div>
<div class="t-member">
<h2><span class="mw-headline" id="atomic.3Cshared_ptr.3CT.3E.3E::operator_std::shared_ptr.3CT.3E"><span style="font-size:0.7em; line-height:130%">atomic&lt;shared_ptr&lt;T&gt;&gt;::</span>operator std::shared_ptr&lt;T&gt;</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-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</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>&#31561;&#20215;&#20110; <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> &#12290;</p>
</div>
<div class="t-member">
<h2><span class="mw-headline" id="atomic.3Cshared_ptr.3CT.3E.3E::exchange"><span style="font-size:0.7em; line-height:130%">atomic&lt;shared_ptr&lt;T&gt;&gt;::</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-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> exchange<span class="br0">(</span><a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> desired,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <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>&#22914;&#21516;&#29992; <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> &#65292;&#21407;&#23376;&#22320;&#20197; <code>desired</code> &#26367;&#25442;&#24213;&#23618; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span></span></span> &#65292;&#20854;&#20013; <span class="t-c"><span class="mw-geshi cpp source-cpp">p</span></span> &#20026;&#24213;&#23618; <span class="t-lc">std::shared_ptr&lt;T&gt;</span> &#65292;&#24182;&#36820;&#22238;&#35813; <span class="t-c"><span class="mw-geshi cpp source-cpp">p</span></span> &#30340;&#20540;&#30340;&#21103;&#26412;&#12290;&#25353;&#29031; <code>order</code> &#25490;&#24207;&#20869;&#23384;&#12290;&#36825;&#26159;&#21407;&#23376;&#35835;&#20462;&#25913;&#20889;&#25805;&#20316;&#12290;</p>
</div>
<div class="t-member">
<h2><span class="mw-headline" id="atomic.3Cshared_ptr.3CT.3E.3E::compare_exchange_weak.2C_compare_exchange_strong"><span style="font-size:0.7em; line-height:130%">atomic&lt;shared_ptr&lt;T&gt;&gt;::</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-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy3">&amp;</span> expected, <a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> desired,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<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-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy3">&amp;</span> expected, <a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> desired,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<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-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy3">&amp;</span> expected, <a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> desired,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<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-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy3">&amp;</span> expected, <a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> desired,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<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> &#33509;&#24213;&#23618; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span></span></span> &#23384;&#20648;&#21516; <code>expected</code> &#30340; <span class="t-c"><span class="mw-geshi cpp source-cpp">T<span class="sy2">*</span></span></span> &#24182;&#19982;&#20043;&#20849;&#20139;&#25152;&#26377;&#26435;&#65292;&#25110;&#33509;&#24213;&#23618;&#25351;&#38024;&#21644; <code>expected</code> &#22343;&#20026;&#31354;&#65292;&#21017;&#20174; <code>desired</code> &#36171;&#20540;&#32473;&#24213;&#23618; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span></span></span> &#24182;&#36820;&#22238; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> &#65292;&#25353;&#29031; <code>success</code> &#25490;&#24207;&#20869;&#23384;&#65307;&#21542;&#21017;&#20174;&#24213;&#23618; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span></span></span> &#36171;&#20540;&#32473; <code>expected</code> &#24182;&#36820;&#22238; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> &#65292;&#25353;&#29031; <code>failure</code> &#25490;&#24207;&#20869;&#23384;&#12290;&#33509; <code>failure</code> &#20026; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_release</a></span> &#25110; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acq_rel</a></span> &#21017;&#34892;&#20026;&#26410;&#23450;&#20041;&#12290;&#25104;&#21151;&#26102;&#65292;&#25805;&#20316;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> &#19978;&#30340;&#35835;&#20462;&#25913;&#20889;&#25805;&#20316;&#65292;&#32780;&#19988;&#22312;&#21407;&#23376;&#26356;&#26032;&#21518;&#19981;&#35775;&#38382; <code>expected</code> &#12290;&#22833;&#36133;&#26102;&#65292;&#25805;&#20316;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> &#19978;&#30340;&#21407;&#23376;&#21152;&#36733;&#25805;&#20316;&#65292;&#24182;&#26356;&#26032; <code>expected</code> &#20026;&#20174;&#21407;&#23376;&#23545;&#35937;&#35835;&#21462;&#30340;&#26082;&#23384;&#20540;&#12290;&#36825;&#20010;&#23545; <code>expected</code> &#30340; use_count &#30340;&#26356;&#26032;&#26159;&#21407;&#23376;&#25805;&#20316;&#30340;&#19968;&#37096;&#20998;&#65292;&#23613;&#31649;&#19981;&#35201;&#27714;&#20889;&#20837;&#33258;&#36523;&#65288;&#20197;&#21450;&#20219;&#20309;&#21518;&#32487;&#30340;&#35299;&#20998;&#37197;/&#26512;&#26500;&#65289;&#26159;&#20854;&#19968;&#37096;&#20998;&#12290;</div>
<div class="t-li1"><span class="t-li">2)</span> &#21516; <span class="t-v">(1)</span> &#65292;&#20294;&#20801;&#35768;&#34394;&#20551;&#22320;&#22833;&#36133;&#12290;</div>
<div class="t-li1"><span class="t-li">3)</span> &#31561;&#20215;&#20110;&#65306; <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> &#65292;&#20854;&#20013; <code>fail_order</code> &#19982; <code>order</code> &#30456;&#21516;&#65292;&#38500;&#20102; <span class="t-lc">std:memory_order_acq_rel</span> &#34987;&#26367;&#25442;&#20026; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acquire</a></span> &#65292;&#32780; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_release</a></span> &#34987;&#26367;&#25442;&#20026; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_relaxed</a></span> &#12290;</div>
<div class="t-li1"><span class="t-li">4)</span> &#31561;&#20215;&#20110;&#65306; <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> &#65292;&#20854;&#20013; <code>fail_order</code> &#19982; <code>order</code> &#30456;&#21516;&#65292;&#38500;&#20102; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acq_rel</a></span> &#34987;&#26367;&#25442;&#20026; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acquire</a></span> &#32780; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_release</a></span> &#34987;&#26367;&#25442;&#20026; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_relaxed</a></span> &#12290;</div>
</div>
<div class="t-member">
<h2><span class="mw-headline" id="atomic.3Cshared_ptr.3CT.3E.3E::wait"><span style="font-size:0.7em; line-height:130%">atomic&lt;shared_ptr&lt;T&gt;&gt;::</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-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> old<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <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>&#36827;&#34892;&#21407;&#23376;&#31561;&#24453;&#25805;&#20316;&#12290;</p>
<p>&#27604;&#36739; <span class="t-c"><span class="mw-geshi cpp source-cpp">load<span class="br0">(</span>order<span class="br0">)</span></span></span> &#19982; <code>old</code> &#65292;&#32780;&#33509;&#23427;&#20204;&#31561;&#20215;&#21017;&#38459;&#22622;&#30452;&#33267; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> &#34987; <code>notify_one()</code> &#25110; <code>notify_all()</code> &#25552;&#37266;&#12290;&#37325;&#22797;&#27492;&#25805;&#20316;&#30452;&#33267; <span class="t-c"><span class="mw-geshi cpp source-cpp">load<span class="br0">(</span>order<span class="br0">)</span></span></span> &#26356;&#25913;&#12290;&#27492;&#20989;&#25968;&#20445;&#35777;&#20165;&#33509;&#20540;&#26356;&#25913;&#25165;&#36820;&#22238;&#65292;&#21363;&#20351;&#24213;&#23618;&#23454;&#29616;&#34394;&#20551;&#22320;&#38500;&#38459;&#12290;</p>
<p>&#25353;&#29031; <code>order</code> &#25490;&#24207;&#20869;&#23384;&#12290;&#33509; <code>order</code> &#20026; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_release</a></span> &#25110; <span class="t-lc"><a href="cpp-atomic-memory_order.html">std::memory_order_acq_rel</a></span> &#21017;&#34892;&#20026;&#26410;&#23450;&#20041;&#12290;</p>
<p>&#27880;&#35299;&#65306;&#33509;&#20108;&#20010; <code>shared_ptr</code> &#23384;&#20648;&#21516;&#19968;&#25351;&#38024;&#65292;&#19988;&#35201;&#20040;&#20849;&#20139;&#25152;&#26377;&#26435;&#35201;&#20040;&#37117;&#20026;&#31354;&#65292;&#21017;&#23427;&#20204;&#31561;&#20215;&#12290;</p>
</div>
<div class="t-member">
<h2><span class="mw-headline" id="atomic.3Cshared_ptr.3CT.3E.3E::notify_one"><span style="font-size:0.7em; line-height:130%">atomic&lt;shared_ptr&lt;T&gt;&gt;::</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>&#36827;&#34892;&#21407;&#23376;&#25552;&#37266;&#25805;&#20316;&#12290;</p>
<p>&#33509;&#26377;&#19968;&#20010;&#32447;&#31243;&#22312; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> &#19978;&#30340;&#21407;&#23376;&#31561;&#24453;&#25805;&#20316;&#65288;&#21363; <code>wait()</code> &#65289;&#20013;&#38459;&#22622;&#65292;&#21017;&#38500;&#38459;&#33267;&#23569;&#19968;&#20010;&#36825;&#31181;&#32447;&#31243;&#65292;&#21542;&#21017;&#19981;&#20570;&#20219;&#20309;&#20107;&#12290;</p>
</div>
<div class="t-member">
<h2><span class="mw-headline" id="atomic.3Cshared_ptr.3CT.3E.3E::notify_all"><span style="font-size:0.7em; line-height:130%">atomic&lt;shared_ptr&lt;T&gt;&gt;::</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>&#36827;&#34892;&#21407;&#23376;&#25552;&#37266;&#25805;&#20316;&#12290;</p>
<p>&#38500;&#38459;&#25152;&#26377;&#22312; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> &#19978;&#30340;&#21407;&#23376;&#31561;&#24453;&#25805;&#20316;&#65288;&#21363; <code>wait()</code> &#65289;&#20013;&#38459;&#22622;&#30340;&#32447;&#31243;&#65292;&#33509;&#23384;&#22312;&#65307;&#21542;&#21017;&#19981;&#20570;&#20219;&#20309;&#20107;&#12290;</p>
</div>
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E5.B8.B8.E9.87.8F">&#25104;&#21592;&#24120;&#37327;</span></h3>
<p>&#27492;&#29305;&#21270;&#20134;&#25552;&#20379;&#26631;&#20934; <span class="t-lc"><a href="cpp-atomic-atomic.html">std::atomic</a></span> &#20165;&#26377;&#30340;&#25104;&#21592;&#24120;&#37327; <code>is_always_lock_free</code> &#12290;</p>
<div class="t-member">
<h2><span class="mw-headline" id="atomic.3Cshared_ptr.3CT.3E.3E::is_always_lock_free"><span style="font-size:0.7em; line-height:130%">atomic&lt;shared_ptr&lt;T&gt;&gt;::</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">&#31034;&#20363;</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="">&#26412;&#33410;&#26410;&#23436;&#25104;<br />
&#21407;&#22240;&#65306;&#26242;&#26080;&#31034;&#20363;</td>
</tr>
</table>
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">&#21442;&#38405;</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 &#31867;&#27169;&#26495;&#21450;&#20854;&#38024;&#23545;&#24067;&#23572;&#12289;&#25972;&#22411;&#21644;&#25351;&#38024;&#31867;&#22411;&#30340;&#29305;&#21270;<br />
<span class="t-mark">(&#31867;&#27169;&#26495;)</span></td>
</tr>
</table>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>