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

562 lines
83 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::memory_order</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_memory_order 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>memory_order</h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="cpp.html">cpp</a>&lrm; | <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>&#23450;&#20041;&#20110;&#22836;&#25991;&#20214; <code><a href="cpp-header-atomic.html">&lt;atomic&gt;</a></code></div>
</td>
<td></td>
<td></td>
</tr>
</tbody>
<tbody class="t-dcl-rev">
<tr class="t-dcl t-since-cxx11 t-until-cxx20">
<td>
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">typedef</span> <span class="kw2">enum</span> memory_order <span class="br0">{</span><br /></span>
<p>&nbsp; &nbsp; memory_order_relaxed,<br />
&nbsp; &nbsp; memory_order_consume,<br />
&nbsp; &nbsp; memory_order_acquire,<br />
&nbsp; &nbsp; memory_order_release,<br />
&nbsp; &nbsp; memory_order_acq_rel,<br />
&nbsp; &nbsp; memory_order_seq_cst<br /></p>
<span class="br0">}</span> memory_order<span class="sy4">;</span></div>
</td>
<td class="t-dcl-nopad"></td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span><br />
<span class="t-mark-rev t-until-cxx20">(C++20 &#21069;)</span></td>
</tr>
<tr class="t-dcl t-since-cxx20">
<td>
<div><span class="mw-geshi cpp source-cpp"><span class="kw2">enum</span> <span class="kw1">class</span> memory_order <span class="sy4">:</span> <span class="coMULTI">/*unspecified*/</span> <span class="br0">{</span><br /></span>
<p>&nbsp; &nbsp; relaxed, consume, acquire, release, acq_rel, seq_cst<br />
<span class="br0">}</span><span class="sy4">;</span><br />
<span class="kw1">inline</span> <span class="kw4">constexpr</span> memory_order memory_order_relaxed <span class="sy1">=</span> memory_order<span class="sy4">::</span><span class="me2">relaxed</span><span class="sy4">;</span><br />
<span class="kw1">inline</span> <span class="kw4">constexpr</span> memory_order memory_order_consume <span class="sy1">=</span> memory_order<span class="sy4">::</span><span class="me2">consume</span><span class="sy4">;</span><br />
<span class="kw1">inline</span> <span class="kw4">constexpr</span> memory_order memory_order_acquire <span class="sy1">=</span> memory_order<span class="sy4">::</span><span class="me2">acquire</span><span class="sy4">;</span><br />
<span class="kw1">inline</span> <span class="kw4">constexpr</span> memory_order memory_order_release <span class="sy1">=</span> memory_order<span class="sy4">::</span><span class="me2">release</span><span class="sy4">;</span><br />
<span class="kw1">inline</span> <span class="kw4">constexpr</span> memory_order memory_order_acq_rel <span class="sy1">=</span> memory_order<span class="sy4">::</span><span class="me2">acq_rel</span><span class="sy4">;</span><br /></p>
<span class="kw1">inline</span> <span class="kw4">constexpr</span> memory_order memory_order_seq_cst <span class="sy1">=</span> memory_order<span class="sy4">::</span><span class="me2">seq_cst</span><span class="sy4">;</span></div>
</td>
<td class="t-dcl-nopad"></td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
</tbody>
<tbody>
<tr class="t-dcl-sep">
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p><code>std::memory_order</code> &#25351;&#23450;&#20869;&#23384;&#35775;&#38382;&#65292;&#21253;&#25324;&#24120;&#35268;&#30340;&#38750;&#21407;&#23376;&#20869;&#23384;&#35775;&#38382;&#65292;&#22914;&#20309;&#22260;&#32469;&#21407;&#23376;&#25805;&#20316;&#25490;&#24207;&#12290;&#22312;&#27809;&#26377;&#20219;&#20309;&#21046;&#32422;&#30340;&#22810;&#22788;&#29702;&#22120;&#31995;&#32479;&#19978;&#65292;&#22810;&#20010;&#32447;&#31243;&#21516;&#26102;&#35835;&#25110;&#20889;&#25968;&#20010;&#21464;&#37327;&#26102;&#65292;&#19968;&#20010;&#32447;&#31243;&#33021;&#35266;&#27979;&#21040;&#21464;&#37327;&#20540;&#26356;&#25913;&#30340;&#39034;&#24207;&#19981;&#21516;&#20110;&#21478;&#19968;&#20010;&#32447;&#31243;&#20889;&#23427;&#20204;&#30340;&#39034;&#24207;&#12290;&#20854;&#23454;&#65292;&#26356;&#25913;&#30340;&#39034;&#24207;&#29978;&#33267;&#33021;&#22312;&#22810;&#20010;&#35835;&#21462;&#32447;&#31243;&#38388;&#30456;&#24322;&#12290;&#19968;&#20123;&#31867;&#20284;&#30340;&#25928;&#26524;&#36824;&#33021;&#22312;&#21333;&#22788;&#29702;&#22120;&#31995;&#32479;&#19978;&#20986;&#29616;&#65292;&#22240;&#20026;&#20869;&#23384;&#27169;&#22411;&#20801;&#35768;&#32534;&#35793;&#22120;&#21464;&#25442;&#12290;</p>
<p>&#24211;&#20013;&#25152;&#26377;&#21407;&#23376;&#25805;&#20316;&#30340;&#40664;&#35748;&#34892;&#20026;&#25552;&#20379;<i>&#24207;&#21015;&#19968;&#33268;&#39034;&#24207;</i>&#65288;&#35265;&#21518;&#36848;&#35752;&#35770;&#65289;&#12290;&#35813;&#40664;&#35748;&#34892;&#20026;&#21487;&#33021;&#26377;&#25439;&#24615;&#33021;&#65292;&#19981;&#36807;&#21487;&#20197;&#32473;&#20104;&#24211;&#30340;&#21407;&#23376;&#25805;&#20316;&#39069;&#22806;&#30340; <code>std::memory_order</code> &#21442;&#25968;&#65292;&#20197;&#25351;&#23450;&#38468;&#21152;&#21046;&#32422;&#65292;&#22312;&#21407;&#23376;&#24615;&#22806;&#65292;&#32534;&#35793;&#22120;&#21644;&#22788;&#29702;&#22120;&#36824;&#24517;&#39035;&#24378;&#21046;&#35813;&#25805;&#20316;&#12290;</p>
<h3><span class="mw-headline" id=".E5.B8.B8.E9.87.8F">&#24120;&#37327;</span></h3>
<table class="t-dsc-begin">
<tr class="t-dsc-header">
<td colspan="2">
<div>&#23450;&#20041;&#20110;&#22836;&#25991;&#20214; <code><a href="cpp-header-atomic.html">&lt;atomic&gt;</a></code></div>
</td>
</tr>
<tr class="t-dsc-hitem">
<td>&#20540;</td>
<td>&#35299;&#37322;</td>
</tr>
<tr class="t-dsc">
<td><code>memory_order_relaxed</code></td>
<td>&#23485;&#26494;&#25805;&#20316;&#65306;&#27809;&#26377;&#21516;&#27493;&#25110;&#39034;&#24207;&#21046;&#32422;&#65292;&#20165;&#23545;&#27492;&#25805;&#20316;&#35201;&#27714;&#21407;&#23376;&#24615;&#65288;&#35265;&#19979;&#26041;<a href="cpp-atomic-memory_order.html#.E5.AE.BD.E6.9D.BE.E9.A1.BA.E5.BA.8F">&#23485;&#26494;&#39034;&#24207;</a>&#65289;&#12290;</td>
</tr>
<tr class="t-dsc">
<td><code>memory_order_consume</code></td>
<td>&#26377;&#27492;&#20869;&#23384;&#39034;&#24207;&#30340;&#21152;&#36733;&#25805;&#20316;&#65292;&#22312;&#20854;&#24433;&#21709;&#30340;&#20869;&#23384;&#20301;&#32622;&#36827;&#34892;<i>&#28040;&#36153;&#25805;&#20316;</i>&#65306;&#24403;&#21069;&#32447;&#31243;&#20013;&#20381;&#36182;&#20110;&#24403;&#21069;&#21152;&#36733;&#30340;&#35813;&#20540;&#30340;&#35835;&#25110;&#20889;&#19981;&#33021;&#34987;&#37325;&#25490;&#21040;&#27492;&#21152;&#36733;&#21069;&#12290;&#20854;&#20182;&#37322;&#25918;&#21516;&#19968;&#21407;&#23376;&#21464;&#37327;&#30340;&#32447;&#31243;&#30340;&#23545;&#25968;&#25454;&#20381;&#36182;&#21464;&#37327;&#30340;&#20889;&#20837;&#65292;&#20026;&#24403;&#21069;&#32447;&#31243;&#25152;&#21487;&#35265;&#12290;&#22312;&#22823;&#22810;&#25968;&#24179;&#21488;&#19978;&#65292;&#36825;&#21482;&#24433;&#21709;&#21040;&#32534;&#35793;&#22120;&#20248;&#21270;&#65288;&#35265;&#19979;&#26041;<a href="cpp-atomic-memory_order.html#.E9.87.8A.E6.94.BE.E6.B6.88.E8.B4.B9.E9.A1.BA.E5.BA.8F">&#37322;&#25918;&#28040;&#36153;&#39034;&#24207;</a>&#65289;&#12290;</td>
</tr>
<tr class="t-dsc">
<td><code>memory_order_acquire</code></td>
<td>&#26377;&#27492;&#20869;&#23384;&#39034;&#24207;&#30340;&#21152;&#36733;&#25805;&#20316;&#65292;&#22312;&#20854;&#24433;&#21709;&#30340;&#20869;&#23384;&#20301;&#32622;&#36827;&#34892;<i>&#33719;&#24471;&#25805;&#20316;</i>&#65306;&#24403;&#21069;&#32447;&#31243;&#20013;&#35835;&#25110;&#20889;&#19981;&#33021;&#34987;&#37325;&#25490;&#21040;&#27492;&#21152;&#36733;&#21069;&#12290;&#20854;&#20182;&#37322;&#25918;&#21516;&#19968;&#21407;&#23376;&#21464;&#37327;&#30340;&#32447;&#31243;&#30340;&#25152;&#26377;&#20889;&#20837;&#65292;&#33021;&#20026;&#24403;&#21069;&#32447;&#31243;&#25152;&#35265;&#65288;&#35265;&#19979;&#26041;<a href="cpp-atomic-memory_order.html#.E9.87.8A.E6.94.BE.E8.8E.B7.E5.BE.97.E9.A1.BA.E5.BA.8F">&#37322;&#25918;&#33719;&#24471;&#39034;&#24207;</a>&#65289;&#12290;</td>
</tr>
<tr class="t-dsc">
<td><code>memory_order_release</code></td>
<td>&#26377;&#27492;&#20869;&#23384;&#39034;&#24207;&#30340;&#23384;&#20648;&#25805;&#20316;&#36827;&#34892;<i>&#37322;&#25918;&#25805;&#20316;</i>&#65306;&#24403;&#21069;&#32447;&#31243;&#20013;&#30340;&#35835;&#25110;&#20889;&#19981;&#33021;&#34987;&#37325;&#25490;&#21040;&#27492;&#23384;&#20648;&#21518;&#12290;&#24403;&#21069;&#32447;&#31243;&#30340;&#25152;&#26377;&#20889;&#20837;&#65292;&#21487;&#35265;&#20110;&#33719;&#24471;&#35813;&#21516;&#19968;&#21407;&#23376;&#21464;&#37327;&#30340;&#20854;&#20182;&#32447;&#31243;&#65288;&#35265;&#19979;&#26041;<a href="cpp-atomic-memory_order.html#.E9.87.8A.E6.94.BE.E8.8E.B7.E5.BE.97.E9.A1.BA.E5.BA.8F">&#37322;&#25918;&#33719;&#24471;&#39034;&#24207;</a>&#65289;&#65292;&#24182;&#19988;&#23545;&#35813;&#21407;&#23376;&#21464;&#37327;&#30340;&#24102;&#20381;&#36182;&#20889;&#20837;&#21464;&#24471;&#23545;&#20110;&#20854;&#20182;&#28040;&#36153;&#21516;&#19968;&#21407;&#23376;&#23545;&#35937;&#30340;&#32447;&#31243;&#21487;&#35265;&#65288;&#35265;&#19979;&#26041;<a href="cpp-atomic-memory_order.html#.E9.87.8A.E6.94.BE.E6.B6.88.E8.B4.B9.E9.A1.BA.E5.BA.8F">&#37322;&#25918;&#28040;&#36153;&#39034;&#24207;</a>&#65289;&#12290;</td>
</tr>
<tr class="t-dsc">
<td><code>memory_order_acq_rel</code></td>
<td>&#24102;&#27492;&#20869;&#23384;&#39034;&#24207;&#30340;&#35835;&#20462;&#25913;&#20889;&#25805;&#20316;&#26082;&#26159;<i>&#33719;&#24471;&#25805;&#20316;</i>&#21448;&#26159;<i>&#37322;&#25918;&#25805;&#20316;</i>&#12290;&#24403;&#21069;&#32447;&#31243;&#30340;&#35835;&#25110;&#20889;&#20869;&#23384;&#19981;&#33021;&#34987;&#37325;&#25490;&#21040;&#27492;&#23384;&#20648;&#21069;&#25110;&#21518;&#12290;&#25152;&#26377;&#37322;&#25918;&#21516;&#19968;&#21407;&#23376;&#21464;&#37327;&#30340;&#32447;&#31243;&#30340;&#20889;&#20837;&#21487;&#35265;&#20110;&#20462;&#25913;&#20043;&#21069;&#65292;&#32780;&#19988;&#20462;&#25913;&#21487;&#35265;&#20110;&#20854;&#20182;&#33719;&#24471;&#21516;&#19968;&#21407;&#23376;&#21464;&#37327;&#30340;&#32447;&#31243;&#12290;</td>
</tr>
<tr class="t-dsc">
<td><code>memory_order_seq_cst</code></td>
<td>&#26377;&#27492;&#20869;&#23384;&#39034;&#24207;&#30340;&#21152;&#36733;&#25805;&#20316;&#36827;&#34892;<i>&#33719;&#24471;&#25805;&#20316;</i>&#65292;&#23384;&#20648;&#25805;&#20316;&#36827;&#34892;<i>&#37322;&#25918;&#25805;&#20316;</i>&#65292;&#32780;&#35835;&#20462;&#25913;&#20889;&#25805;&#20316;&#36827;&#34892;<i>&#33719;&#24471;&#25805;&#20316;</i>&#21644;<i>&#37322;&#25918;&#25805;&#20316;</i>&#65292;&#20877;&#21152;&#19978;&#23384;&#22312;&#19968;&#20010;&#21333;&#29420;&#20840;&#24207;&#65292;&#20854;&#20013;&#25152;&#26377;&#32447;&#31243;&#20197;&#21516;&#19968;&#39034;&#24207;&#35266;&#27979;&#21040;&#25152;&#26377;&#20462;&#25913;&#65288;&#35265;&#19979;&#26041;<a href="cpp-atomic-memory_order.html#.E5.BA.8F.E5.88.97.E4.B8.80.E8.87.B4.E9.A1.BA.E5.BA.8F">&#24207;&#21015;&#19968;&#33268;&#39034;&#24207;</a>&#65289;&#12290;</td>
</tr>
</table>
<h3><span class="mw-headline" id=".E6.AD.A3.E5.BC.8F.E6.8F.8F.E8.BF.B0">&#27491;&#24335;&#25551;&#36848;</span></h3>
<p>&#32447;&#31243;&#38388;&#21516;&#27493;&#21644;&#20869;&#23384;&#39034;&#24207;&#20915;&#23450;&#34920;&#36798;&#24335;&#30340;<i>&#27714;&#20540;</i>&#21644;<i>&#21103;&#25928;&#24212;</i>&#22914;&#20309;&#22312;&#19981;&#21516;&#30340;&#25191;&#34892;&#32447;&#31243;&#38388;&#25490;&#24207;&#12290;&#23427;&#20204;&#29992;&#19979;&#21015;&#26415;&#35821;&#23450;&#20041;&#65306;</p>
<h4><span class="mw-headline" id=".E5.85.88.E5.BA.8F.E4.BA.8E">&#20808;&#24207;&#20110;</span></h4>
<p>&#22312;&#21516;&#19968;&#32447;&#31243;&#20013;&#65292;&#27714;&#20540; A &#21487;&#20197;<i>&#20808;&#24207;&#20110;</i>&#27714;&#20540; B &#65292;&#22914;<a href="cpp-language-eval_order.html">&#27714;&#20540;&#39034;&#24207;</a>&#20013;&#25152;&#25551;&#36848;&#12290;</p>
<h4><span class="mw-headline" id=".E6.90.BA.E5.B8.A6.E4.BE.9D.E8.B5.96">&#25658;&#24102;&#20381;&#36182;</span></h4>
<p>&#22312;&#21516;&#19968;&#32447;&#31243;&#20013;&#65292;&#33509;&#19979;&#21015;&#20219;&#19968;&#20026;&#30495;&#65292;&#21017;<i>&#20808;&#24207;&#20110;</i>&#27714;&#20540; B &#30340;&#27714;&#20540; A &#21487;&#33021;&#20063;&#20250;&#23558;&#20381;&#36182;&#24102;&#20837; B &#65288;&#21363; B &#20381;&#36182;&#20110; A &#65289;</p>
<div class="t-li1"><span class="t-li">1)</span> A &#30340;&#20540;&#34987;&#29992;&#20316; B &#30340;&#36816;&#31639;&#25968;&#65292;<b>&#38500;&#20102;</b></div>
<div class="t-li2"><span class="t-li">a)</span> B &#26159;&#23545; <span class="t-lc"><a href="cpp-atomic-kill_dependency.html">std::kill_dependency</a></span> &#30340;&#35843;&#29992;</div>
<div class="t-li2"><span class="t-li">b)</span> A&#26159;&#20869;&#24314; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">&amp;&amp;</span></span></span> &#12289; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">||</span></span></span> &#12289; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy4">?:</span></span></span> &#25110; <span class="t-c"><span class="mw-geshi cpp source-cpp">,</span></span> &#36816;&#31639;&#31526;&#30340;&#24038;&#36816;&#31639;&#25968;&#12290;</div>
<div class="t-li1"><span class="t-li">2)</span> A &#20889;&#20837;&#26631;&#37327;&#23545;&#35937; M&#65292;B &#20174; M &#35835;&#21462;</div>
<div class="t-li1"><span class="t-li">3)</span> A &#23558;&#20381;&#36182;&#25658;&#24102;&#20837;&#21478;&#19968;&#27714;&#20540; X &#65292;&#32780; X &#23558;&#20381;&#36182;&#25658;&#24102;&#20837; B</div>
<h4><span class="mw-headline" id=".E4.BF.AE.E6.94.B9.E9.A1.BA.E5.BA.8F">&#20462;&#25913;&#39034;&#24207;</span></h4>
<p>&#23545;&#20219;&#20309;&#29305;&#23450;&#30340;&#21407;&#23376;&#21464;&#37327;&#30340;&#20462;&#25913;&#65292;&#20197;&#38480;&#23450;&#20110;&#27492;&#19968;&#21407;&#23376;&#21464;&#37327;&#30340;&#21333;&#29420;&#20840;&#24207;&#20986;&#29616;&#12290;</p>
<p>&#23545;&#25152;&#26377;&#21407;&#23376;&#25805;&#20316;&#20445;&#35777;&#19979;&#21015;&#22235;&#20010;&#35201;&#27714;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> <b>&#20889;&#20889;&#36830;&#36143;</b>&#65306;&#33509;&#20462;&#25913;&#26576;&#21407;&#23376;&#23545;&#35937; M &#30340;&#27714;&#20540; A &#65288;&#20889;&#25805;&#20316;&#65289;<i>&#20808;&#21457;&#29983;&#20110;</i>&#20462;&#25913; M &#30340;&#27714;&#20540; B &#65292;&#21017; A &#22312; M &#30340;<i>&#20462;&#25913;&#39034;&#24207;</i>&#20013;&#26089;&#20110; B &#20986;&#29616;&#12290;</div>
<div class="t-li1"><span class="t-li">2)</span> <b>&#35835;&#35835;&#36830;&#36143;</b>&#65306;&#33509;&#26576;&#21407;&#23376;&#23545;&#35937; M &#30340;&#20540;&#35745;&#31639; A &#65288;&#35835;&#25805;&#20316;&#65289;<i>&#20808;&#21457;&#29983;&#20110;</i>&#23545; M &#30340;&#20540;&#35745;&#31639; B &#65292;&#19988; A &#30340;&#20540;&#26469;&#33258;&#23545; M &#30340;&#20889;&#25805;&#20316; X &#65292;&#21017; B &#30340;&#20540;&#35201;&#20040;&#26159; X &#25152;&#23384;&#20648;&#30340;&#20540;&#65292;&#35201;&#20040;&#26159;&#22312; M &#30340;<i>&#20462;&#25913;&#39034;&#24207;</i>&#20013;&#21518;&#20110; X &#20986;&#29616;&#30340; M &#19978;&#30340;&#21103;&#25928;&#24212; Y &#25152;&#23384;&#20648;&#30340;&#20540;&#12290;</div>
<div class="t-li1"><span class="t-li">3)</span> <b>&#35835;&#20889;&#36830;&#36143;</b>&#65306;&#33509;&#26576;&#21407;&#23376;&#23545;&#35937; M &#30340;&#20540;&#35745;&#31639; A &#65288;&#35835;&#25805;&#20316;&#65289;<i>&#20808;&#21457;&#29983;&#20110;</i> M &#19978;&#30340;&#25805;&#20316; B &#65288;&#20889;&#25805;&#20316;&#65289;&#65292;&#21017; A &#30340;&#20540;&#26469;&#33258; M &#30340;<i>&#20462;&#25913;&#39034;&#24207;</i>&#20013;&#26089;&#20110; B &#20986;&#29616;&#30340;&#21103;&#25928;&#24212; X &#65288;&#20889;&#25805;&#20316;&#65289;&#12290;</div>
<div class="t-li1"><span class="t-li">4)</span> <b>&#20889;&#35835;&#36830;&#36143;</b>&#65306;&#33509;&#21407;&#23376;&#23545;&#35937; M &#19978;&#30340;&#21103;&#25928;&#24212; X &#65288;&#20889;&#25805;&#20316;&#65289;<i>&#20808;&#21457;&#29983;&#20110;</i> M &#30340;&#20540;&#35745;&#31639; B &#65288;&#35835;&#25805;&#20316;&#65289;&#65292;&#21017;&#27714;&#20540; B &#24212;&#20174; X &#25110;&#20174; M &#30340;<i>&#20462;&#25913;&#39034;&#24207;</i>&#20013;&#21518;&#38543; X &#30340;&#21103;&#25928;&#24212; Y &#21462;&#24471;&#20854;&#20540;&#12290;</div>
<h4><span class="mw-headline" id=".E9.87.8A.E6.94.BE.E5.BA.8F.E5.88.97">&#37322;&#25918;&#24207;&#21015;</span></h4>
<p>&#22312;&#21407;&#23376;&#23545;&#35937; M &#19978;&#25191;&#34892;&#19968;&#27425;<i>&#37322;&#25918;&#25805;&#20316;</i> A &#20043;&#21518;&#65292; M &#30340;&#20462;&#25913;&#39034;&#24207;&#30340;&#26368;&#38271;&#36830;&#32493;&#23376;&#24207;&#21015;&#30001;&#19979;&#21015;&#20869;&#23481;&#32452;&#25104;</p>
<table class="t-rev-begin">
<tr class="t-rev t-until-cxx20">
<td>
<div class="t-li1"><span class="t-li">1)</span> &#30001;&#25191;&#34892; A &#30340;&#21516;&#19968;&#32447;&#31243;&#25152;&#25191;&#34892;&#30340;&#20889;&#25805;&#20316;</div>
</td>
<td><span class="t-mark-rev t-until-cxx20">(C++20 &#21069;)</span></td>
</tr>
</table>
<div class="t-li1"><span class="t-li">2)</span> &#20219;&#20309;&#32447;&#31243;&#23545; M &#30340;&#21407;&#23376;&#30340;&#35835;-&#20462;&#25913;-&#20889;&#25805;&#20316;</div>
<p>&#34987;&#31216;&#20026;<i>&#20197; A &#20026;&#39318;&#30340;&#37322;&#25918;&#24207;&#21015;</i>&#12290;</p>
<h4><span class="mw-headline" id=".E4.BE.9D.E8.B5.96.E5.85.88.E5.BA.8F.E4.BA.8E">&#20381;&#36182;&#20808;&#24207;&#20110;</span></h4>
<p>&#22312;&#32447;&#31243;&#38388;&#65292;&#33509;&#19979;&#21015;&#20219;&#19968;&#20026;&#30495;&#65292;&#21017;&#27714;&#20540; A <i>&#20381;&#36182;&#20808;&#24207;&#20110;</i>&#27714;&#20540; B</p>
<div class="t-li1"><span class="t-li">1)</span> A &#22312;&#26576;&#21407;&#23376;&#23545;&#35937; M &#19978;&#36827;&#34892;<i>&#37322;&#25918;&#25805;&#20316;</i>&#65292;&#32780;&#19981;&#21516;&#30340;&#32447;&#31243;&#20013;&#65292; B &#22312;&#21516;&#19968;&#21407;&#23376;&#23545;&#35937; M &#19978;&#36827;&#34892;<i>&#28040;&#36153;&#25805;&#20316;</i>&#65292;&#32780; B &#35835;&#21462; A <span class="t-rev-inl t-until-cxx20"><span>&#25152;&#24341;&#39046;&#30340;&#37322;&#25918;&#24207;&#21015;&#30340;&#20219;&#20309;&#37096;&#20998;</span> <span><span class="t-mark-rev t-until-cxx20">(C++20 &#21069;)</span></span></span>&#25152;&#20889;&#20837;&#30340;&#20540;&#12290;</div>
<div class="t-li1"><span class="t-li">2)</span> A &#20381;&#36182;&#20808;&#24207;&#20110; X &#19988; X &#25658;&#24102;&#20381;&#36182;&#21040; B &#12290;</div>
<h4><span class="mw-headline" id=".E7.BA.BF.E7.A8.8B.E9.97.B4.E5.85.88.E5.8F.91.E7.94.9F.E4.BA.8E">&#32447;&#31243;&#38388;&#20808;&#21457;&#29983;&#20110;</span></h4>
<p>&#22312;&#32447;&#31243;&#38388;&#65292;&#33509;&#19979;&#21015;&#20219;&#19968;&#20026;&#30495;&#65292;&#21017;&#27714;&#20540; A <i>&#32447;&#31243;&#38388;&#20808;&#21457;&#29983;&#20110;</i>&#27714;&#20540; B</p>
<div class="t-li1"><span class="t-li">1)</span> A <i>&#21516;&#27493;&#20110;</i> B</div>
<div class="t-li1"><span class="t-li">2)</span> A <i>&#20381;&#36182;&#20808;&#24207;&#20110;</i> B</div>
<div class="t-li1"><span class="t-li">3)</span> A <i>&#21516;&#27493;&#20110;</i>&#26576;&#27714;&#20540; X &#65292;&#32780; X <i>&#20808;&#24207;&#20110;</i> B</div>
<div class="t-li1"><span class="t-li">4)</span> A <i>&#20808;&#24207;&#20110;</i>&#26576;&#27714;&#20540; X &#65292;&#32780; X <i>&#32447;&#31243;&#38388;&#20808;&#21457;&#29983;&#20110;</i> B</div>
<div class="t-li1"><span class="t-li">5)</span> A <i>&#32447;&#31243;&#38388;&#20808;&#21457;&#29983;&#20110;</i>&#26576;&#27714;&#20540; X &#65292;&#32780; X <i>&#32447;&#31243;&#38388;&#20808;&#21457;&#29983;&#20110;</i> B</div>
<h4><span class="mw-headline" id=".E5.85.88.E5.8F.91.E7.94.9F.E4.BA.8E">&#20808;&#21457;&#29983;&#20110;</span></h4>
<p>&#26080;&#20851;&#20046;&#32447;&#31243;&#65292;&#33509;&#19979;&#21015;&#20219;&#19968;&#20026;&#30495;&#65292;&#21017;&#27714;&#20540; A <i>&#20808;&#21457;&#29983;&#20110;</i>&#27714;&#20540; B &#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> A <i>&#20808;&#24207;&#20110;</i> B</div>
<div class="t-li1"><span class="t-li">2)</span> A <i>&#32447;&#31243;&#38388;&#20808;&#21457;&#29983;&#20110;</i> B</div>
<p>&#35201;&#27714;&#23454;&#29616;&#30830;&#20445;<i>&#20808;&#21457;&#29983;&#20110;</i>&#20851;&#31995;&#26159;&#38750;&#24490;&#29615;&#30340;&#65292;&#33509;&#26377;&#24517;&#35201;&#21017;&#24341;&#20837;&#39069;&#22806;&#30340;&#21516;&#27493;&#65288;&#33509;&#24341;&#20837;&#28040;&#36153;&#25805;&#20316;&#65292;&#23427;&#25165;&#21487;&#33021;&#20026;&#24517;&#35201;&#65292;&#35265; <a rel="nofollow" class="external text" href="http://www.cl.cam.ac.uk/~pes20/cpp/popl085ap-sewell.pdf">Batty &#31561;</a>&#65289;&#12290;</p>
<p>&#33509;&#19968;&#27425;&#27714;&#20540;&#20462;&#25913;&#19968;&#20010;&#20869;&#23384;&#20301;&#32622;&#65292;&#32780;&#20854;&#20182;&#27714;&#20540;&#35835;&#25110;&#20462;&#25913;&#21516;&#19968;&#20869;&#23384;&#20301;&#32622;&#65292;&#19988;&#33267;&#23569;&#19968;&#20010;&#27714;&#20540;&#19981;&#26159;&#21407;&#23376;&#25805;&#20316;&#65292;&#21017;&#31243;&#24207;&#30340;&#34892;&#20026;&#26410;&#23450;&#20041;&#65288;&#31243;&#24207;&#26377;<a href="cpp-language-memory_model.html">&#25968;&#25454;&#31454;&#20105;</a>&#65289;&#65292;&#38500;&#38750;&#36825;&#20004;&#20010;&#27714;&#20540;&#20043;&#38388;&#23384;&#22312;<i>&#20808;&#21457;&#29983;&#20110;</i>&#20851;&#31995;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx20">
<td>
<h4><span class="mw-headline" id=".E7.AE.80.E5.8D.95.E5.85.88.E5.8F.91.E7.94.9F.E4.BA.8E">&#31616;&#21333;&#20808;&#21457;&#29983;&#20110;</span></h4>
<p>&#26080;&#20851;&#20046;&#32447;&#31243;&#65292;&#33509;&#19979;&#21015;&#20043;&#19968;&#20026;&#30495;&#65292;&#21017;&#27714;&#20540; A <i>&#31616;&#21333;&#20808;&#21457;&#29983;&#20110;</i>&#27714;&#20540; B &#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> A <i>&#20808;&#24207;&#20110;</i> B</div>
<div class="t-li1"><span class="t-li">2)</span> A <i>&#21516;&#27493;&#20110;</i> B</div>
<div class="t-li1"><span class="t-li">3)</span> A <i>&#31616;&#21333;&#20808;&#21457;&#29983;&#20110;</i> X &#65292;&#32780; X <i>&#31616;&#21333;&#20808;&#21457;&#29983;&#20110;</i> B</div>
<p>&#27880;&#65306;&#19981;&#35745;&#28040;&#36153;&#25805;&#20316;&#65292;&#21017;<i>&#31616;&#21333;&#20808;&#21457;&#29983;&#20110;</i>&#19982;<i>&#24378;&#20808;&#21457;&#29983;&#20110;</i>&#20851;&#31995;&#26159;&#30456;&#21516;&#30340;&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
</table>
<h4><span class="mw-headline" id=".E5.BC.BA.E5.85.88.E5.8F.91.E7.94.9F.E4.BA.8E">&#24378;&#20808;&#21457;&#29983;&#20110;</span></h4>
<p>&#26080;&#20851;&#20046;&#32447;&#31243;&#65292;&#33509;&#19979;&#21015;&#20043;&#19968;&#20026;&#30495;&#65292;&#21017;&#27714;&#20540; A <i>&#24378;&#20808;&#21457;&#29983;&#20110;</i>&#27714;&#20540; B &#65306;</p>
<table class="t-rev-begin">
<tr class="t-rev t-until-cxx20">
<td>
<div class="t-li1"><span class="t-li">1)</span> A <i>&#20808;&#24207;&#20110;</i> B</div>
<div class="t-li1"><span class="t-li">2)</span> A <i>&#21516;&#27493;&#20110;</i> B</div>
<div class="t-li1"><span class="t-li">3)</span> A <i>&#24378;&#20808;&#21457;&#29983;&#20110;</i> X &#65292;&#32780; X <i>&#24378;&#20808;&#21457;&#29983;&#20110;</i> B</div>
</td>
<td><span class="t-mark-rev t-until-cxx20">(C++20 &#21069;)</span></td>
</tr>
<tr class="t-rev t-since-cxx20">
<td>
<div class="t-li1"><span class="t-li">1)</span> A <i>&#20808;&#24207;&#20110;</i> B</div>
<div class="t-li1"><span class="t-li">2)</span> A <i>&#21516;&#27493;&#20110;</i> B &#65292;&#19988; A &#19982; B &#22343;&#20026;&#24207;&#21015;&#19968;&#33268;&#30340;&#21407;&#23376;&#25805;&#20316;</div>
<div class="t-li1"><span class="t-li">3)</span> A <i>&#20808;&#24207;&#20110;</i> X &#65292; X <i>&#31616;&#21333;&#20808;&#21457;&#29983;&#20110;</i> Y &#65292;&#32780; Y <i>&#20808;&#24207;&#20110;</i> B</div>
<div class="t-li1"><span class="t-li">4)</span> A <i>&#24378;&#20808;&#21457;&#29983;&#20110;</i> X &#65292;&#32780; X <i>&#24378;&#20808;&#21457;&#29983;&#20110;</i> B</div>
<p>&#27880;&#65306;&#38750;&#27491;&#24335;&#32780;&#35328;&#65292;&#33509; A <i>&#24378;&#20808;&#21457;&#29983;&#20110;</i> B &#65292;&#21017;&#22312;&#25152;&#26377;&#29615;&#22659;&#20013; A &#22343;&#26174;&#24471;&#22312; B &#20043;&#21069;&#24471;&#21040;&#27714;&#20540;&#12290;</p>
<p>&#27880;&#65306;<i>&#24378;&#20808;&#21457;&#29983;&#20110;</i>&#25490;&#38500;&#28040;&#36153;&#25805;&#20316;&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
</table>
<h4><span class="mw-headline" id=".E5.8F.AF.E8.A7.81.E5.89.AF.E6.95.88.E5.BA.94">&#21487;&#35265;&#21103;&#25928;&#24212;</span></h4>
<p>&#33509;&#19979;&#21015;&#30342;&#20026;&#30495;&#65292;&#21017;&#26631;&#37327; M &#19978;&#30340;&#21103;&#25928;&#24212; A &#65288;&#20889;&#20837;&#65289;&#30456;&#23545;&#20110; M &#19978;&#30340;&#20540;&#35745;&#31639;&#65288;&#35835;&#21462;&#65289;<i>&#21487;&#35265;</i>&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> A <i>&#20808;&#21457;&#29983;&#20110;</i> B</div>
<div class="t-li1"><span class="t-li">2)</span> &#27809;&#26377;&#20854;&#20182;&#23545; M &#30340;&#21103;&#25928;&#24212; X &#28385;&#36275; A <i>&#20808;&#21457;&#29983;&#20110;</i> X &#19988; X <i>&#20808;&#21457;&#29983;&#20110;</i> B</div>
<p>&#33509;&#21103;&#25928;&#24212; A &#30456;&#23545;&#20110;&#20540;&#35745;&#31639; B &#21487;&#35265;&#65292;&#21017;<i>&#20462;&#25913;&#39034;&#24207;</i>&#20013;&#65292;&#28385;&#36275; B &#19981;<i>&#20808;&#21457;&#29983;&#20110;</i>&#23427;&#30340;&#23545; M &#30340;&#21103;&#25928;&#24212;&#30340;&#26368;&#38271;&#30456;&#25509;&#23376;&#38598;&#65292;&#34987;&#31216;&#20026;<i>&#21103;&#25928;&#24212;&#30340;&#21487;&#35265;&#24207;&#21015;</i>&#12290;&#65288; B &#25152;&#30830;&#23450;&#30340; M &#30340;&#20540;&#65292;&#23558;&#26159;&#36825;&#20123;&#21103;&#25928;&#24212;&#20043;&#19968;&#25152;&#23384;&#20648;&#30340;&#20540;&#65289;</p>
<p>&#27880;&#24847;&#65306;&#32447;&#31243;&#38388;&#21516;&#27493;&#21487;&#24402;&#32467;&#20026;&#36991;&#20813;&#25968;&#25454;&#31454;&#20105;&#65288;&#36890;&#36807;&#24314;&#31435;&#20808;&#21457;&#29983;&#20110;&#20851;&#31995;&#65289;&#65292;&#21450;&#23450;&#20041;&#22312;&#20309;&#31181;&#26465;&#20214;&#19979;&#21738;&#20123;&#21103;&#25928;&#24212;&#25104;&#20026;&#21487;&#35265;&#12290;</p>
<h4><span class="mw-headline" id=".E6.B6.88.E8.B4.B9.E6.93.8D.E4.BD.9C">&#28040;&#36153;&#25805;&#20316;</span></h4>
<p>&#24102; <code>memory_order_consume</code> &#25110;&#26356;&#24378;&#26631;&#31614;&#30340;&#21407;&#23376;&#21152;&#36733;&#26159;&#28040;&#36153;&#25805;&#20316;&#12290;&#27880;&#24847; <span class="t-lc"><a href="cpp-atomic-atomic_thread_fence.html">std::atomic_thread_fence</a></span> &#20250;&#26045;&#21152;&#27604;&#28040;&#36153;&#25805;&#20316;&#26356;&#24378;&#30340;&#21516;&#27493;&#35201;&#27714;&#12290;</p>
<h4><span class="mw-headline" id=".E8.8E.B7.E5.BE.97.E6.93.8D.E4.BD.9C">&#33719;&#24471;&#25805;&#20316;</span></h4>
<p>&#24102; <code>memory_order_acquire</code> &#25110;&#26356;&#24378;&#26631;&#31614;&#30340;&#21407;&#23376;&#21152;&#36733;&#26159;&#33719;&#24471;&#25805;&#20316;&#12290;<a href="cpp-named_req-Mutex.html"><span style="font-style:italic">&#20114;&#26021;&#20307;</span> <span style="font-family: Georgia, &#39;DejaVu Serif&#39;, serif; font-style:italic">(Mutex)</span></a> &#19978;&#30340; lock() &#25805;&#20316;&#20134;&#20026;&#33719;&#24471;&#25805;&#20316;&#12290;&#27880;&#24847; <span class="t-lc"><a href="cpp-atomic-atomic_thread_fence.html">std::atomic_thread_fence</a></span> &#20250;&#26045;&#21152;&#27604;&#33719;&#24471;&#25805;&#20316;&#26356;&#24378;&#30340;&#21516;&#27493;&#35201;&#27714;&#12290;</p>
<h4><span class="mw-headline" id=".E9.87.8A.E6.94.BE.E6.93.8D.E4.BD.9C">&#37322;&#25918;&#25805;&#20316;</span></h4>
<p>&#24102; <code>memory_order_release</code> &#25110;&#26356;&#24378;&#26631;&#31614;&#30340;&#21407;&#23376;&#23384;&#20648;&#26159;&#37322;&#25918;&#25805;&#20316;&#12290;<a href="cpp-named_req-Mutex.html"><span style="font-style:italic">&#20114;&#26021;&#20307;</span> <span style="font-family: Georgia, &#39;DejaVu Serif&#39;, serif; font-style:italic">(Mutex)</span></a> &#19978;&#30340; unlock() &#25805;&#20316;&#20134;&#20026;&#37322;&#25918;&#25805;&#20316;&#12290;&#27880;&#24847; <span class="t-lc"><a href="cpp-atomic-atomic_thread_fence.html">std::atomic_thread_fence</a></span> &#20250;&#26045;&#21152;&#27604;&#37322;&#25918;&#25805;&#20316;&#26356;&#24378;&#30340;&#21516;&#27493;&#35201;&#27714;&#12290;</p>
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">&#35299;&#37322;</span></h3>
<h4><span class="mw-headline" id=".E5.AE.BD.E6.9D.BE.E9.A1.BA.E5.BA.8F">&#23485;&#26494;&#39034;&#24207;</span></h4>
<p>&#24102;&#26631;&#31614; <span class="t-c"><span class="mw-geshi cpp source-cpp">memory_order_relaxed</span></span> &#30340;&#21407;&#23376;&#25805;&#20316;&#26080;&#21516;&#27493;&#25805;&#20316;&#65307;&#23427;&#20204;&#19981;&#20250;&#22312;&#20849;&#26102;&#30340;&#20869;&#23384;&#35775;&#38382;&#38388;&#24378;&#21152;&#39034;&#24207;&#12290;&#23427;&#20204;&#21482;&#20445;&#35777;&#21407;&#23376;&#24615;&#21644;&#20462;&#25913;&#39034;&#24207;&#19968;&#33268;&#24615;&#12290;</p>
<p>&#20363;&#22914;&#65292;&#23545;&#20110;&#26368;&#21021;&#20026;&#38646;&#30340; <code>x</code> &#21644; <code>y</code> &#65292;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#32447;&#31243; 1 &#65306;</span>
r1 <span class="sy1">=</span> y.<span class="me1">load</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">memory_order_relaxed</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// A</span>
x.<span class="me1">store</span><span class="br0">(</span>r1, std<span class="sy4">::</span><span class="me2">memory_order_relaxed</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// B</span>
<span class="co1">// &#32447;&#31243; 2 &#65306;</span>
r2 <span class="sy1">=</span> x.<span class="me1">load</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">memory_order_relaxed</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// C </span>
y.<span class="me1">store</span><span class="br0">(</span><span class="nu0">42</span>, std<span class="sy4">::</span><span class="me2">memory_order_relaxed</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// D</span></pre></div>
</div>
<p>&#20801;&#35768;&#20135;&#29983;&#32467;&#26524; <code>r1 == 42 &amp;&amp; r2 == 42</code> &#65292;&#22240;&#20026;&#21363;&#20351;&#32447;&#31243; 1 &#20013; A <i>&#20808;&#24207;&#20110;</i> B &#19988;&#32447;&#31243; 2 &#20013; C <i>&#20808;&#24207;&#20110;</i> D &#65292;&#21364;&#27809;&#26377;&#21046;&#32422;&#36991;&#20813; <code>y</code> &#30340;&#20462;&#25913;&#39034;&#24207;&#20013; D &#20808;&#20986;&#29616;&#20110; A &#65292;&#32780; <code>x</code> &#30340;&#20462;&#25913;&#39034;&#24207;&#20013; B &#20808;&#20986;&#29616;&#20110; C &#12290; D &#22312; <code>y</code> &#19978;&#30340;&#21103;&#25928;&#24212;&#65292;&#21487;&#33021;&#21487;&#35265;&#20110;&#32447;&#31243; 1 &#20013;&#30340;&#21152;&#36733; A &#65292;&#21516;&#26102; B &#22312; <code>x</code> &#19978;&#30340;&#21103;&#25928;&#24212;&#65292;&#21487;&#33021;&#21487;&#35265;&#20110;&#32447;&#31243; 2 &#20013;&#30340;&#21152;&#36733; C &#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx14">
<td>
<p>&#21363;&#20351;&#20351;&#29992;&#23485;&#26494;&#20869;&#23384;&#27169;&#22411;&#65292;&#20063;&#19981;&#20801;&#35768;&ldquo;&#26080;&#20013;&#29983;&#26377;&rdquo;&#30340;&#20540;&#24490;&#29615;&#22320;&#20381;&#36182;&#20110;&#20854;&#21508;&#33258;&#30340;&#35745;&#31639;&#65292;&#20363;&#22914;&#65292;&#23545;&#20110;&#26368;&#21021;&#20026;&#38646;&#30340; <code>x</code> &#21644; <code>y</code> &#65292;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#32447;&#31243;1&#65306;</span>
r1 <span class="sy1">=</span> x.<span class="me1">load</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">memory_order_relaxed</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">if</span> <span class="br0">(</span>r1 <span class="sy1">==</span> <span class="nu0">42</span><span class="br0">)</span> y.<span class="me1">store</span><span class="br0">(</span>r1, std<span class="sy4">::</span><span class="me2">memory_order_relaxed</span><span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#32447;&#31243;2&#65306;</span>
r2 <span class="sy1">=</span> y.<span class="me1">load</span><span class="br0">(</span>memory_order_relaxed<span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">if</span> <span class="br0">(</span>r2 <span class="sy1">==</span> <span class="nu0">42</span><span class="br0">)</span> x.<span class="me1">store</span><span class="br0">(</span><span class="nu0">42</span>, std<span class="sy4">::</span><span class="me2">memory_order_relaxed</span><span class="br0">)</span><span class="sy4">;</span></pre></div>
</div>
<p>&#19981;&#20801;&#35768;&#20135;&#29983;&#32467;&#26524; <code>r1 == 42 &amp;&amp; r2 == 42</code> &#65292;&#22240;&#20026;&#23384;&#20648; 42 &#20110; <code>y</code> &#21482;&#22312;&#23384;&#20648; 42 &#20110; <code>x</code> &#21518;&#26377;&#21487;&#33021;&#65292;&#36825;&#21448;&#24490;&#29615;&#20381;&#36182;&#20110;&#23384;&#20648; 42 &#20110; <code>y</code> &#12290;&#27880;&#24847; C++14 &#21069;&#35268;&#33539;&#26366;&#22312;&#25216;&#26415;&#19978;&#20801;&#35768;&#65292;&#20294;&#19981;&#25512;&#33616;&#23454;&#29616;&#32773;&#22914;&#27492;&#23454;&#29616;&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx14">(C++14 &#36215;)</span></td>
</tr>
</table>
<p>&#23485;&#26494;&#20869;&#23384;&#39034;&#24207;&#30340;&#20856;&#22411;&#20351;&#29992;&#26159;&#35745;&#25968;&#22120;&#33258;&#22686;&#65292;&#20363;&#22914; <span class="t-lc"><a href="cpp-memory-shared_ptr.html">std::shared_ptr</a></span> &#30340;&#24341;&#29992;&#35745;&#25968;&#22120;&#65292;&#22240;&#20026;&#36825;&#21482;&#35201;&#27714;&#21407;&#23376;&#24615;&#65292;&#20294;&#19981;&#35201;&#27714;&#39034;&#24207;&#25110;&#21516;&#27493;&#65288;&#27880;&#24847; <span class="t-lc"><a href="cpp-memory-shared_ptr.html">std::shared_ptr</a></span> &#35745;&#25968;&#22120;&#33258;&#20943;&#35201;&#27714;&#19982;&#26512;&#26500;&#20989;&#25968;&#36827;&#34892;&#33719;&#24471;&#37322;&#25918;&#21516;&#27493;&#65289;</p>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;vector&gt;</span>
<span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;thread&gt;</span>
<span class="co2">#include &lt;atomic&gt;</span>
<a href="cpp-atomic-atomic.html"><span class="kw2066">std::<span class="me2">atomic</span></span></a><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> cnt <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">0</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> n <span class="sy1">&lt;</span> <span class="nu0">1000</span><span class="sy4">;</span> <span class="sy2">++</span>n<span class="br0">)</span> <span class="br0">{</span>
cnt.<span class="me1">fetch_add</span><span class="br0">(</span><span class="nu0">1</span>, std<span class="sy4">::</span><span class="me2">memory_order_relaxed</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1">&lt;</span><a href="cpp-thread-thread.html"><span class="kw2139">std::<span class="me2">thread</span></span></a><span class="sy1">&gt;</span> v<span class="sy4">;</span>
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> n <span class="sy1">&lt;</span> <span class="nu0">10</span><span class="sy4">;</span> <span class="sy2">++</span>n<span class="br0">)</span> <span class="br0">{</span>
v.<span class="me1">emplace_back</span><span class="br0">(</span>f<span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">auto</span><span class="sy3">&amp;</span> t <span class="sy4">:</span> v<span class="br0">)</span> <span class="br0">{</span>
t.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Final counter value is &quot;</span> <span class="sy1">&lt;&lt;</span> cnt <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">Final counter value is 10000</pre></div>
</div>
</div>
<h4><span class="mw-headline" id=".E9.87.8A.E6.94.BE.E8.8E.B7.E5.BE.97.E9.A1.BA.E5.BA.8F">&#37322;&#25918;&#33719;&#24471;&#39034;&#24207;</span></h4>
<p>&#33509;&#32447;&#31243; A &#20013;&#30340;&#19968;&#20010;&#21407;&#23376;&#23384;&#20648;&#24102;&#26631;&#31614; <span class="t-c"><span class="mw-geshi cpp source-cpp">memory_order_release</span></span> &#65292;&#32780;&#32447;&#31243; B &#20013;&#26469;&#33258;&#21516;&#19968;&#21464;&#37327;&#30340;&#21407;&#23376;&#21152;&#36733;&#24102;&#26631;&#31614; <span class="t-c"><span class="mw-geshi cpp source-cpp">memory_order_acquire</span></span> &#65292;&#21017;&#20174;&#32447;&#31243; A &#30340;&#35270;&#35282;<i>&#20808;&#21457;&#29983;&#20110;</i>&#21407;&#23376;&#23384;&#20648;&#30340;&#25152;&#26377;&#20869;&#23384;&#20889;&#20837;&#65288;&#38750;&#21407;&#23376;&#21450;&#23485;&#26494;&#21407;&#23376;&#30340;&#65289;&#65292;&#22312;&#32447;&#31243; B &#20013;&#25104;&#20026;<i>&#21487;&#35265;&#21103;&#25928;&#24212;</i>&#65292;&#21363;&#19968;&#26086;&#21407;&#23376;&#21152;&#36733;&#23436;&#25104;&#65292;&#21017;&#20445;&#35777;&#32447;&#31243; B &#33021;&#35266;&#23519;&#21040;&#32447;&#31243; A &#20889;&#20837;&#20869;&#23384;&#30340;&#25152;&#26377;&#20869;&#23481;&#12290;</p>
<p>&#21516;&#27493;&#20165;&#24314;&#31435;&#22312;<i>&#37322;&#25918;</i>&#21644;<i>&#33719;&#24471;</i>&#21516;&#19968;&#21407;&#23376;&#23545;&#35937;&#30340;&#32447;&#31243;&#20043;&#38388;&#12290;&#20854;&#20182;&#32447;&#31243;&#21487;&#33021;&#30475;&#21040;&#19982;&#34987;&#21516;&#27493;&#32447;&#31243;&#30340;&#19968;&#32773;&#25110;&#20004;&#32773;&#30456;&#24322;&#30340;&#20869;&#23384;&#35775;&#38382;&#39034;&#24207;&#12290;</p>
<p>&#22312;&#24378;&#39034;&#24207;&#31995;&#32479;&#65288; x86 &#12289; SPARC TSO &#12289; IBM &#20027;&#26694;&#26550;&#65289;&#19978;&#65292;&#37322;&#25918;&#33719;&#24471;&#39034;&#24207;&#23545;&#20110;&#22810;&#25968;&#25805;&#20316;&#26159;&#33258;&#21160;&#36827;&#34892;&#30340;&#12290;&#26080;&#38656;&#20026;&#27492;&#21516;&#27493;&#27169;&#24335;&#28155;&#21152;&#39069;&#22806;&#30340; CPU &#25351;&#20196;&#65292;&#21482;&#26377;&#26576;&#20123;&#32534;&#35793;&#22120;&#20248;&#21270;&#21463;&#24433;&#21709;&#65288;&#20363;&#22914;&#65292;&#32534;&#35793;&#22120;&#34987;&#31105;&#27490;&#23558;&#38750;&#21407;&#23376;&#23384;&#20648;&#31227;&#21040;&#21407;&#23376;&#23384;&#20648;-&#37322;&#25918;&#21518;&#65292;&#25110;&#23558;&#38750;&#21407;&#23376;&#21152;&#36733;&#31227;&#21040;&#21407;&#23376;&#21152;&#36733;-&#33719;&#24471;&#21069;&#65289;&#12290;&#22312;&#24369;&#39034;&#24207;&#31995;&#32479;&#65288; ARM &#12289; Itanium &#12289; Power PC &#65289;&#19978;&#65292;&#24517;&#39035;&#20351;&#29992;&#29305;&#21035;&#30340; CPU &#21152;&#36733;&#25110;&#20869;&#23384;&#26629;&#26639;&#25351;&#20196;&#12290;</p>
<p>&#20114;&#26021;&#38145;&#65288;&#20363;&#22914; <span class="t-lc"><a href="cpp-thread-mutex.html">std::mutex</a></span> &#25110;<a href="cpp-atomic-atomic_flag.html">&#21407;&#23376;&#33258;&#26059;&#38145;</a>&#65289;&#26159;&#37322;&#25918;&#33719;&#24471;&#21516;&#27493;&#30340;&#20363;&#23376;&#65306;&#32447;&#31243; A &#37322;&#25918;&#38145;&#32780;&#32447;&#31243; B &#33719;&#24471;&#23427;&#26102;&#65292;&#21457;&#29983;&#20110;&#32447;&#31243; A &#29615;&#22659;&#30340;&#20020;&#30028;&#21306;&#65288;&#37322;&#25918;&#20043;&#21069;&#65289;&#20013;&#30340;&#25152;&#26377;&#20107;&#20214;&#65292;&#24517;&#39035;&#23545;&#20110;&#25191;&#34892;&#21516;&#19968;&#20020;&#30028;&#21306;&#30340;&#32447;&#31243; B &#65288;&#33719;&#24471;&#20043;&#21518;&#65289;&#21487;&#35265;&#12290;</p>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;thread&gt;</span>
<span class="co2">#include &lt;atomic&gt;</span>
<span class="co2">#include &lt;cassert&gt;</span>
<span class="co2">#include &lt;string&gt;</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-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="sy2">*</span><span class="sy1">&gt;</span> ptr<span class="sy4">;</span>
<span class="kw4">int</span> data<span class="sy4">;</span>
<span class="kw4">void</span> producer<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="sy2">*</span> p <span class="sy1">=</span> new <a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="br0">(</span><span class="st0">&quot;Hello&quot;</span><span class="br0">)</span><span class="sy4">;</span>
data <span class="sy1">=</span> <span class="nu0">42</span><span class="sy4">;</span>
ptr.<span class="me1">store</span><span class="br0">(</span>p, std<span class="sy4">::</span><span class="me2">memory_order_release</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">void</span> consumer<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="sy2">*</span> p2<span class="sy4">;</span>
<span class="kw1">while</span> <span class="br0">(</span><span class="sy3">!</span><span class="br0">(</span>p2 <span class="sy1">=</span> ptr.<span class="me1">load</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">memory_order_acquire</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>
<span class="sy4">;</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span><span class="sy2">*</span>p2 <span class="sy1">==</span> <span class="st0">&quot;Hello&quot;</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#32477;&#26080;&#38382;&#39064;</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span>data <span class="sy1">==</span> <span class="nu0">42</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#32477;&#26080;&#38382;&#39064;</span>
<span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<a href="cpp-thread-thread.html"><span class="kw2139">std::<span class="me2">thread</span></span></a> t1<span class="br0">(</span>producer<span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-thread-thread.html"><span class="kw2139">std::<span class="me2">thread</span></span></a> t2<span class="br0">(</span>consumer<span class="br0">)</span><span class="sy4">;</span>
t1.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> t2.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
</div>
<div class="t-example">
<p>&#19979;&#20363;&#28436;&#31034;&#19977;&#20010;&#32447;&#31243;&#38388;&#20256;&#36882;&#24615;&#30340;&#37322;&#25918;&#33719;&#24471;&#39034;&#24207;</p>
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;thread&gt;</span>
<span class="co2">#include &lt;atomic&gt;</span>
<span class="co2">#include &lt;cassert&gt;</span>
<span class="co2">#include &lt;vector&gt;</span>
<a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> data<span class="sy4">;</span>
<a href="cpp-atomic-atomic.html"><span class="kw2066">std::<span class="me2">atomic</span></span></a><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> flag <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">0</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">void</span> thread_1<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
data.<span class="me1">push_back</span><span class="br0">(</span><span class="nu0">42</span><span class="br0">)</span><span class="sy4">;</span>
flag.<span class="me1">store</span><span class="br0">(</span><span class="nu0">1</span>, std<span class="sy4">::</span><span class="me2">memory_order_release</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">void</span> thread_2<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw4">int</span> expected<span class="sy1">=</span><span class="nu0">1</span><span class="sy4">;</span>
<span class="kw1">while</span> <span class="br0">(</span><span class="sy3">!</span>flag.<span class="me1">compare_exchange_strong</span><span class="br0">(</span>expected, <span class="nu0">2</span>, std<span class="sy4">::</span><span class="me2">memory_order_acq_rel</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span>
expected <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span>
<span class="kw4">void</span> thread_3<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">while</span> <span class="br0">(</span>flag.<span class="me1">load</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">memory_order_acquire</span><span class="br0">)</span> <span class="sy1">&lt;</span> <span class="nu0">2</span><span class="br0">)</span>
<span class="sy4">;</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span>data.<span class="me1">at</span><span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span> <span class="sy1">==</span> <span class="nu0">42</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#20915;&#19981;&#20986;&#38169;</span>
<span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<a href="cpp-thread-thread.html"><span class="kw2139">std::<span class="me2">thread</span></span></a> a<span class="br0">(</span>thread_1<span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-thread-thread.html"><span class="kw2139">std::<span class="me2">thread</span></span></a> b<span class="br0">(</span>thread_2<span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-thread-thread.html"><span class="kw2139">std::<span class="me2">thread</span></span></a> c<span class="br0">(</span>thread_3<span class="br0">)</span><span class="sy4">;</span>
a.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> b.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> c.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
</div>
<h4><span class="mw-headline" id=".E9.87.8A.E6.94.BE.E6.B6.88.E8.B4.B9.E9.A1.BA.E5.BA.8F">&#37322;&#25918;&#28040;&#36153;&#39034;&#24207;</span></h4>
<p>&#33509;&#32447;&#31243; A &#20013;&#30340;&#21407;&#23376;&#23384;&#20648;&#24102;&#26631;&#31614; <span class="t-c"><span class="mw-geshi cpp source-cpp">memory_order_release</span></span> &#32780;&#32447;&#31243; B &#20013;&#26469;&#33258;&#21516;&#19968;&#23545;&#35937;&#30340;&#35835;&#21462;&#23384;&#20648;&#20540;&#30340;&#21407;&#23376;&#21152;&#36733;&#24102;&#26631;&#31614; <span class="t-c"><span class="mw-geshi cpp source-cpp">memory_order_consume</span></span> &#65292;&#21017;&#32447;&#31243; A &#35270;&#35282;&#20013;<i>&#20808;&#21457;&#29983;&#20110;</i>&#21407;&#23376;&#23384;&#20648;&#30340;&#25152;&#26377;&#20869;&#23384;&#20889;&#20837;&#65288;&#38750;&#21407;&#23376;&#21644;&#23485;&#26494;&#21407;&#23376;&#30340;&#65289;&#65292;&#20250;&#22312;&#32447;&#31243; B &#20013;&#35813;&#21152;&#36733;&#25805;&#20316;&#25152;<i>&#25658;&#24102;&#20381;&#36182;</i>&#36827;&#20837;&#30340;&#25805;&#20316;&#20013;&#21464;&#25104;<i>&#21487;&#35265;&#21103;&#25928;&#24212;</i>&#65292;&#21363;&#19968;&#26086;&#23436;&#25104;&#21407;&#23376;&#21152;&#36733;&#65292;&#21017;&#20445;&#35777;&#32447;&#31243;B&#20013;&#65292;&#20351;&#29992;&#20174;&#35813;&#21152;&#36733;&#33719;&#24471;&#30340;&#20540;&#30340;&#36816;&#31639;&#31526;&#21644;&#20989;&#25968;&#65292;&#33021;&#35265;&#21040;&#32447;&#31243; A &#20889;&#20837;&#20869;&#23384;&#30340;&#20869;&#23481;&#12290;</p>
<p>&#21516;&#27493;&#20165;&#22312;<i>&#37322;&#25918;</i>&#21644;<i>&#28040;&#36153;</i>&#21516;&#19968;&#21407;&#23376;&#23545;&#35937;&#30340;&#32447;&#31243;&#38388;&#24314;&#31435;&#12290;&#20854;&#20182;&#32447;&#31243;&#33021;&#35265;&#21040;&#19982;&#34987;&#21516;&#27493;&#32447;&#31243;&#30340;&#19968;&#32773;&#25110;&#20004;&#32773;&#30456;&#24322;&#30340;&#20869;&#23384;&#35775;&#38382;&#39034;&#24207;&#12290;</p>
<p>&#25152;&#26377;&#24322;&#20110; DEC Alpha &#30340;&#20027;&#27969; CPU &#19978;&#65292;&#20381;&#36182;&#39034;&#24207;&#26159;&#33258;&#21160;&#30340;&#65292;&#26080;&#38656;&#20026;&#27492;&#21516;&#27493;&#27169;&#24335;&#20135;&#29983;&#38468;&#21152;&#30340; CPU &#25351;&#20196;&#65292;&#21482;&#26377;&#26576;&#20123;&#32534;&#35793;&#22120;&#20248;&#21270;&#25910;&#30410;&#21463;&#24433;&#21709;&#65288;&#20363;&#22914;&#65292;&#32534;&#35793;&#22120;&#34987;&#31105;&#27490;&#29301;&#28041;&#21040;&#20381;&#36182;&#38142;&#30340;&#23545;&#35937;&#19978;&#30340;&#25512;&#27979;&#24615;&#21152;&#36733;&#65289;&#12290;</p>
<p>&#27492;&#39034;&#24207;&#30340;&#20856;&#22411;&#20351;&#29992;&#24773;&#20917;&#65292;&#28041;&#21450;&#23545;&#24456;&#23569;&#34987;&#20889;&#20837;&#30340;&#25968;&#25454;&#32467;&#26500;&#65288;&#23433;&#25490;&#34920;&#12289;&#37197;&#32622;&#12289;&#23433;&#20840;&#31574;&#30053;&#12289;&#38450;&#28779;&#22681;&#35268;&#21017;&#31561;&#65289;&#30340;&#20849;&#26102;&#35835;&#21462;&#65292;&#21644;&#26377;&#25351;&#38024;&#20013;&#20171;&#21457;&#24067;&#30340;&#21457;&#24067;&#32773;-&#35746;&#38405;&#32773;&#24773;&#24418;&#65292;&#21363;&#24403;&#29983;&#20135;&#32773;&#21457;&#24067;&#28040;&#36153;&#32773;&#33021;&#36890;&#36807;&#20854;&#35775;&#38382;&#20449;&#24687;&#30340;&#25351;&#38024;&#20043;&#26102;&#65306;&#26080;&#38656;&#20196;&#29983;&#20135;&#32773;&#20889;&#20837;&#20869;&#23384;&#30340;&#25152;&#26377;&#20854;&#20182;&#20869;&#23481;&#23545;&#28040;&#36153;&#32773;&#21487;&#35265;&#65288;&#36825;&#22312;&#24369;&#39034;&#24207;&#26550;&#26500;&#19978;&#21487;&#33021;&#26159;&#26114;&#36149;&#30340;&#25805;&#20316;&#65289;&#12290;&#36825;&#31181;&#22330;&#26223;&#30340;&#20363;&#23376;&#20043;&#19968;&#26159; <a href="https://en.wikipedia.org/wiki/Read-copy-update" class="extiw" title="enwiki:Read-copy-update">rcu &#35299;&#24341;&#29992;</a>&#12290;</p>
<p>&#32454;&#31890;&#24230;&#20381;&#36182;&#38142;&#25511;&#21046;&#21487;&#21442;&#38405; <span class="t-lc"><a href="cpp-atomic-kill_dependency.html">std::kill_dependency</a></span> &#21450; <code>[[<a href="cpp-language-attributes-carries_dependency.html">carries_dependency</a>]]</code> &#12290;</p>
<p>&#27880;&#24847;&#21040; 2015 &#24180; 2 &#26376;&#20026;&#27490;&#27809;&#26377;&#20135;&#21697;&#32534;&#35793;&#22120;&#36319;&#36394;&#20381;&#36182;&#38142;&#65306;&#22343;&#23558;&#28040;&#36153;&#25805;&#20316;&#25552;&#21319;&#20026;&#33719;&#24471;&#25805;&#20316;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx17">
<td>
<p>&#37322;&#25918;&#28040;&#36153;&#39034;&#24207;&#30340;&#35268;&#33539;&#27491;&#22312;&#20462;&#35746;&#20013;&#65292;&#32780;&#19988;&#26242;&#26102;&#19981;&#40723;&#21169;&#20351;&#29992; <code>memory_order_consume</code> &#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></td>
</tr>
</table>
<div class="t-example">
<p>&#27492;&#31034;&#20363;&#28436;&#31034;&#29992;&#20110;&#25351;&#38024;&#20013;&#20171;&#30340;&#21457;&#24067;&#30340;&#20381;&#36182;&#23450;&#24207;&#21516;&#27493;&#65306;int data&#19981;&#30001;&#25968;&#25454;&#20381;&#36182;&#20851;&#31995;&#20851;&#32852;&#21040;&#25351;&#21521;&#23383;&#31526;&#20018;&#30340;&#25351;&#38024;&#65292;&#20174;&#32780;&#20854;&#20540;&#22312;&#28040;&#36153;&#32773;&#20013;&#26410;&#23450;&#20041;&#12290;</p>
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;thread&gt;</span>
<span class="co2">#include &lt;atomic&gt;</span>
<span class="co2">#include &lt;cassert&gt;</span>
<span class="co2">#include &lt;string&gt;</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-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="sy2">*</span><span class="sy1">&gt;</span> ptr<span class="sy4">;</span>
<span class="kw4">int</span> data<span class="sy4">;</span>
<span class="kw4">void</span> producer<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="sy2">*</span> p <span class="sy1">=</span> new <a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="br0">(</span><span class="st0">&quot;Hello&quot;</span><span class="br0">)</span><span class="sy4">;</span>
data <span class="sy1">=</span> <span class="nu0">42</span><span class="sy4">;</span>
ptr.<span class="me1">store</span><span class="br0">(</span>p, std<span class="sy4">::</span><span class="me2">memory_order_release</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">void</span> consumer<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="sy2">*</span> p2<span class="sy4">;</span>
<span class="kw1">while</span> <span class="br0">(</span><span class="sy3">!</span><span class="br0">(</span>p2 <span class="sy1">=</span> ptr.<span class="me1">load</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">memory_order_consume</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>
<span class="sy4">;</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span><span class="sy2">*</span>p2 <span class="sy1">==</span> <span class="st0">&quot;Hello&quot;</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#32477;&#26080;&#20986;&#38169;&#65306; *p2 &#20174; ptr &#25658;&#24102;&#20381;&#36182;</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span>data <span class="sy1">==</span> <span class="nu0">42</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#21487;&#33021;&#20063;&#21487;&#33021;&#19981;&#20250;&#20986;&#38169;&#65306; data &#19981;&#20174; ptr &#25658;&#24102;&#20381;&#36182;</span>
<span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<a href="cpp-thread-thread.html"><span class="kw2139">std::<span class="me2">thread</span></span></a> t1<span class="br0">(</span>producer<span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-thread-thread.html"><span class="kw2139">std::<span class="me2">thread</span></span></a> t2<span class="br0">(</span>consumer<span class="br0">)</span><span class="sy4">;</span>
t1.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> t2.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
</div>
<p><br /></p>
<h4><span class="mw-headline" id=".E5.BA.8F.E5.88.97.E4.B8.80.E8.87.B4.E9.A1.BA.E5.BA.8F">&#24207;&#21015;&#19968;&#33268;&#39034;&#24207;</span></h4>
<p>&#24102;&#26631;&#31614; <span class="t-c"><span class="mw-geshi cpp source-cpp">memory_order_seq_cst</span></span> &#30340;&#21407;&#23376;&#25805;&#20316;&#19981;&#20165;&#20197;&#19982;&#37322;&#25918;/&#33719;&#24471;&#39034;&#24207;&#30456;&#21516;&#30340;&#26041;&#24335;&#25490;&#24207;&#20869;&#23384;&#65288;&#22312;&#19968;&#20010;&#32447;&#31243;&#20013;<i>&#20808;&#21457;&#29983;&#20110;</i>&#23384;&#20648;&#30340;&#20219;&#20309;&#32467;&#26524;&#37117;&#21464;&#25104;&#36827;&#34892;&#21152;&#36733;&#30340;&#32447;&#31243;&#20013;&#30340;<i>&#21487;&#35265;&#21103;&#25928;&#24212;</i>&#65289;&#65292;&#36824;&#23545;&#25152;&#26377;&#24102;&#27492;&#26631;&#31614;&#30340;&#20869;&#23384;&#25805;&#20316;&#24314;&#31435;<i>&#21333;&#29420;&#20840;&#24207;</i>&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-until-cxx20">
<td>
<p>&#27491;&#24335;&#32780;&#35328;&#65292;</p>
<p>&#27599;&#20010;&#21152;&#36733;&#21407;&#23376;&#23545;&#35937; M &#30340; <code>memory_order_seq_cst</code> &#25805;&#20316; B &#65292;&#35266;&#27979;&#21040;&#20197;&#19979;&#20043;&#19968;&#65306;</p>
<ul>
<li>&#20462;&#25913; M &#30340;&#19978;&#20010;&#25805;&#20316; A &#30340;&#32467;&#26524;&#65292;A &#22312;&#21333;&#29420;&#20840;&#24207;&#20013;&#20808;&#20986;&#29616;&#20110; B</li>
<li>&#25110;&#33509;&#23384;&#22312;&#36825;&#31181; A &#65292;&#21017; B &#21487;&#33021;&#35266;&#27979;&#21040;&#26576;&#20123; M &#30340;&#20462;&#25913;&#32467;&#26524;&#65292;&#36825;&#20123;&#20462;&#25913;&#38750; <code>memory_order_seq_cst</code> &#32780;&#19988;&#19981;<i>&#20808;&#21457;&#29983;&#20110;</i> A</li>
<li>&#25110;&#33509;&#19981;&#23384;&#22312;&#36825;&#31181; A &#65292;&#21017; B &#21487;&#33021;&#35266;&#27979;&#21040;&#26576;&#20123; M &#30340;&#26080;&#20851;&#32852;&#20462;&#25913;&#65292;&#36825;&#20123;&#20462;&#25913;&#38750; <code>memory_order_seq_cst</code></li>
</ul>
<p>&#33509;&#23384;&#22312; <code>memory_order_seq_cst</code>&#30340; <span class="t-lc"><a href="cpp-atomic-atomic_thread_fence.html">std::atomic_thread_fence</a></span> &#25805;&#20316; X <i>&#20808;&#24207;&#20110;</i> B &#65292;&#21017; B &#35266;&#27979;&#21040;&#20197;&#19979;&#20043;&#19968;&#65306;</p>
<ul>
<li>&#22312;&#21333;&#29420;&#20840;&#24207;&#20013;&#20808;&#20986;&#29616;&#20110; X &#30340;&#19978;&#20010; M &#30340; <code>memory_order_seq_cst</code> &#20462;&#25913;</li>
<li>&#22312;&#21333;&#29420;&#20840;&#24207;&#20013;&#21518;&#20986;&#29616;&#20110;&#23427;&#30340;&#26576;&#20123; M &#30340;&#26080;&#20851;&#32852;&#20462;&#25913;</li>
</ul>
<p>&#35774;&#26377;&#19968;&#23545; M &#19978;&#30340;&#21407;&#23376;&#25805;&#20316;&#65292;&#31216;&#20043;&#20026; A &#21644; B &#65292;&#36825;&#37324; A &#20889;&#20837;&#12289; B &#35835;&#21462; M &#30340;&#20540;&#65292;&#33509;&#23384;&#22312;&#20108;&#20010; <code>memory_order_seq_cst</code> &#30340; <span class="t-lc"><a href="cpp-atomic-atomic_thread_fence.html">std::atomic_thread_fence</a></span> X &#21644; Y &#65292;&#19988;&#33509; A <i>&#20808;&#24207;&#20110;</i> X &#65292; Y <i>&#20808;&#24207;&#20110;</i> B &#65292;&#19988; X &#22312;&#21333;&#29420;&#20840;&#24207;&#20013;&#20808;&#20986;&#29616;&#20110; Y &#65292;&#21017; B &#35266;&#27979;&#21040;&#20108;&#32773;&#20043;&#19968;&#65306;</p>
<ul>
<li>A &#30340;&#25928;&#24212;</li>
<li>&#26576;&#20123;&#22312; M &#30340;&#20462;&#25913;&#39034;&#24207;&#20013;&#21518;&#20986;&#29616;&#20110; A &#30340;&#26080;&#20851;&#32852;&#20462;&#25913;</li>
</ul>
<p>&#35774;&#26377;&#19968;&#23545; M &#19978;&#30340;&#21407;&#23376;&#25805;&#20316;&#65292;&#31216;&#20043;&#20026; A &#21644; B &#65292;&#33509;&#31526;&#21512;&#19979;&#21015;&#26465;&#20214;&#20043;&#19968;&#65292;&#21017; M &#30340;&#20462;&#25913;&#39034;&#24207;&#20013; B &#20808;&#21457;&#29983;&#20110; A</p>
<ul>
<li>&#23384;&#22312;&#19968;&#20010; <code>memory_order_seq_cst</code> &#30340; <span class="t-lc"><a href="cpp-atomic-atomic_thread_fence.html">std::atomic_thread_fence</a></span> X &#65292;&#23427;&#28385;&#36275; A <i>&#20808;&#24207;&#20110;</i> X &#65292;&#19988; X &#22312;&#21333;&#29420;&#20840;&#24207;&#20013;&#20808;&#20986;&#29616;&#20110; B</li>
<li>&#25110;&#32773;&#65292;&#23384;&#22312;&#19968;&#20010; <code>memory_order_seq_cst</code> &#30340; <span class="t-lc"><a href="cpp-atomic-atomic_thread_fence.html">std::atomic_thread_fence</a></span> Y &#65292;&#23427;&#28385;&#36275; Y <i>&#20808;&#24207;&#20110;</i> B &#65292;&#19988; A &#22312;&#21333;&#29420;&#20840;&#24207;&#20013;&#20808;&#20986;&#29616;&#20110; Y</li>
<li>&#25110;&#32773;&#65292;&#23384;&#22312; <code>memory_order_seq_cst</code> &#30340; <span class="t-lc"><a href="cpp-atomic-atomic_thread_fence.html">std::atomic_thread_fence</a></span> X &#21644; Y &#65292;&#23427;&#20204;&#28385;&#36275; A <i>&#20808;&#24207;&#20110;</i> X &#65292; Y <i>&#20808;&#24207;&#20110;</i> B &#65292;&#19988; X &#22312;&#21333;&#29420;&#20840;&#24207;&#20013;&#20808;&#20986;&#29616;&#20110; Y</li>
</ul>
<p>&#27880;&#24847;&#36825;&#34920;&#26126;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> &#21482;&#35201;&#19981;&#24102; <code>memory_order_seq_cst</code> &#26631;&#31614;&#30340;&#21407;&#23376;&#25805;&#20316;&#36827;&#20837;&#23616;&#38754;&#65292;&#21017;&#31435;&#21363;&#20007;&#22833;&#24207;&#21015;&#19968;&#33268;&#24615;</div>
<div class="t-li1"><span class="t-li">2)</span> &#24207;&#21015;&#19968;&#33268;&#26629;&#26639;&#20165;&#20026;&#26629;&#26639;&#33258;&#36523;&#24314;&#31435;&#20840;&#24207;&#65292;&#32780;&#19981;&#20026;&#36890;&#24120;&#24773;&#20917;&#19979;&#30340;&#21407;&#23376;&#25805;&#20316;&#24314;&#31435;&#65288;<i>&#20808;&#24207;&#20110;</i>&#19981;&#26159;&#36328;&#32447;&#31243;&#20851;&#31995;&#65292;&#19981;&#21516;&#20110;<i>&#20808;&#21457;&#29983;&#20110;</i>&#65289;</div>
</td>
<td><span class="t-mark-rev t-until-cxx20">(C++20 &#21069;)</span></td>
</tr>
<tr class="t-rev t-since-cxx20">
<td>
<p>&#27491;&#24335;&#32780;&#35328;&#65292;</p>
<p>&#26576;&#21407;&#23376;&#23545;&#35937; M &#19978;&#30340;&#21407;&#23376;&#25805;&#20316;<i>&#36830;&#36143;&#20808;&#24207;&#20110;</i> M &#19978;&#30340;&#21478;&#19968;&#21407;&#23376;&#25805;&#20316; B &#65292;&#33509;&#19979;&#21015;&#20219;&#19968;&#20026;&#30495;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> A &#26159;&#20462;&#25913;&#65292;&#32780; B &#35835;&#21462; A &#25152;&#23384;&#20648;&#30340;&#20540;</div>
<div class="t-li1"><span class="t-li">2)</span> A &#22312; M &#30340;<i>&#20462;&#25913;&#39034;&#24207;</i>&#20013;&#21069;&#20110; B</div>
<div class="t-li1"><span class="t-li">3)</span> A &#35835;&#21462;&#21407;&#23376;&#25805;&#20316; X &#25152;&#23384;&#20648;&#30340;&#20540;&#65292;&#32780; X &#22312;<i>&#20462;&#25913;&#39034;&#24207;</i>&#20013;&#21069;&#20110; B &#65292;&#19988; A &#19982; B &#19981;&#26159;&#21516;&#19968;&#35835;&#20462;&#25913;&#20889;&#25805;&#20316;</div>
<div class="t-li1"><span class="t-li">4)</span> A <i>&#36830;&#36143;&#20808;&#24207;&#20110;</i> X &#65292;&#32780; X <i>&#36830;&#36143;&#20808;&#24207;&#20110;</i> B</div>
<p>&#25152;&#26377; <code>memory_order_seq_cst</code> &#25805;&#20316;&#65292;&#21253;&#25324;&#26629;&#26639;&#19978;&#65292;&#26377;&#21333;&#29420;&#20840;&#24207; S &#65292;&#23427;&#28385;&#36275;&#19979;&#21015;&#21046;&#32422;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> &#33509; A &#19982; B &#20026; <code>memory_order_seq_cst</code> &#25805;&#20316;&#65292;&#32780; A <i>&#24378;&#20808;&#21457;&#29983;&#20110;</i> B &#65292;&#21017; A &#22312; S &#20013;&#21069;&#20110; B</div>
<div class="t-li1"><span class="t-li">2)</span> &#23545;&#20110;&#23545;&#35937; M &#19978;&#30340;&#27599;&#23545;&#21407;&#23376;&#25805;&#20316; A &#19982; B &#65292;&#20854;&#20013; A <i>&#36830;&#36143;&#20808;&#24207;&#20110;</i> B &#65306;</div>
<div class="t-li2"><span class="t-li">a)</span> &#33509; A &#19982; B &#37117;&#26159; <code>memory_order_seq_cst</code> &#25805;&#20316;&#65292;&#21017; S &#20013; A &#21069;&#20110; B</div>
<div class="t-li2"><span class="t-li">b)</span> &#33509; A &#26159; <code>memory_order_seq_cst</code> &#25805;&#20316;&#65292;&#32780; B <i>&#20808;&#21457;&#29983;&#20110;</i> <code>memory_order_seq_cst</code> &#26629;&#26639; Y &#65292;&#21017; S &#20013; A &#21069;&#20110; Y</div>
<div class="t-li2"><span class="t-li">c)</span> &#33509; <code>memory_order_seq_cst</code> &#26629;&#26639; X <i>&#20808;&#21457;&#29983;&#20110;</i> A &#65292;&#32780; B &#20026; <code>memory_order_seq_cst</code> &#25805;&#20316;&#65292;&#21017; S &#20013; X &#21069;&#20110; B</div>
<div class="t-li2"><span class="t-li">d)</span> &#33509; <code>memory_order_seq_cst</code> &#26629;&#26639; X <i>&#20808;&#21457;&#29983;&#20110;</i> A &#65292;&#32780; B <i>&#20808;&#21457;&#29983;&#20110;</i> <code>memory_order_seq_cst</code> &#26629;&#26639; Y &#65292;&#21017; S &#20013; X &#21069;&#20110; Y</div>
<p>&#27491;&#24335;&#23450;&#20041;&#30830;&#20445;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> &#21333;&#29420;&#20840;&#24207;&#19982;&#20219;&#20309;&#21407;&#23376;&#23545;&#35937;&#30340;<i>&#20462;&#25913;&#39034;&#24207;</i>&#19968;&#33268;</div>
<div class="t-li1"><span class="t-li">2)</span> <code>memory_order_seq_cst</code> &#21152;&#36733;&#20174;&#26368;&#21518;&#30340; <code>memory_order_seq_cst</code> &#20462;&#25913;&#65292;&#25110;&#20174;&#26576;&#20010;&#19981;<i>&#20808;&#21457;&#29983;&#20110;</i>&#39034;&#24207;&#20013;&#20043;&#21069;&#30340; <code>memory_order_seq_cst</code> &#20462;&#25913;&#25805;&#20316;&#30340;&#38750; <code>memory_order_seq_cst</code> &#20462;&#25913;&#20043;&#19968;&#33719;&#21462;&#20854;&#20540;&#12290;</div>
<p>&#21333;&#29420;&#20840;&#24207;&#21487;&#33021;&#19982;<i>&#20808;&#21457;&#29983;&#20110;</i>&#19981;&#19968;&#33268;&#12290;&#36825;&#20801;&#35768; <code>memory_order_acquire</code> &#19982; <code>memory_order_release</code> &#22312;&#26576;&#20123; CPU &#19978;&#30340;&#26356;&#39640;&#25928;&#23454;&#29616;&#12290;&#24403; <code>memory_order_acquire</code> &#21450; <code>memory_order_release</code> &#19982; <code>memory_order_seq_cst</code> &#28151;&#21512;&#26102;&#65292;&#36825;&#33021;&#20135;&#29983;&#24778;&#24322;&#30340;&#32467;&#26524;&#12290;</p>
<p>&#20363;&#22914;&#65292;&#23545;&#20110;&#21021;&#20540;&#20026;&#38646;&#30340; <code>x</code> &#19982; <code>y</code> &#65292;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#32447;&#31243; 1 &#65306;</span>
x.<span class="me1">store</span><span class="br0">(</span><span class="nu0">1</span>, std<span class="sy4">::</span><span class="me2">memory_order_seq_cst</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// A</span>
y.<span class="me1">store</span><span class="br0">(</span><span class="nu0">1</span>, std<span class="sy4">::</span><span class="me2">memory_order_release</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// B</span>
<span class="co1">// &#32447;&#31243; 2 &#65306;</span>
r1 <span class="sy1">=</span> y.<span class="me1">fetch_add</span><span class="br0">(</span><span class="nu0">1</span>, std<span class="sy4">::</span><span class="me2">memory_order_seq_cst</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// C</span>
r2 <span class="sy1">=</span> y.<span class="me1">load</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">memory_order_relaxed</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// D</span>
<span class="co1">// &#32447;&#31243; 3 &#65306;</span>
y.<span class="me1">store</span><span class="br0">(</span><span class="nu0">3</span>, std<span class="sy4">::</span><span class="me2">memory_order_seq_cst</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// E</span>
r3 <span class="sy1">=</span> x.<span class="me1">load</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">memory_order_seq_cst</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// F</span></pre></div>
</div>
<p>&#20801;&#35768;&#36825;&#20123;&#25805;&#20316;&#20135;&#29983; <code>r1 == 1 &amp;&amp; r2 == 3 &amp;&amp; r3 == 0</code> &#30340;&#32467;&#26524;&#65292;&#20854;&#20013; A <i>&#20808;&#21457;&#29983;&#20110;</i> C &#65292;&#20294; <code>memory_order_seq_cst</code> &#30340;&#21333;&#29420;&#20840;&#24207; C-E-F-A &#20013; C &#21069;&#20110; A &#65288;&#35265; <a rel="nofollow" class="external text" href="https://plv.mpi-sws.org/scfix/paper.pdf">Lahav &#31561;</a>&#65289;&#12290;</p>
<p>&#27880;&#24847;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> &#19968;&#26086;&#19981;&#24102; <code>memory_order_seq_cst</code> &#26631;&#31614;&#30340;&#21407;&#23376;&#25805;&#20316;&#36827;&#20837;&#23616;&#38754;&#65292;&#31243;&#24207;&#30340;&#24207;&#21015;&#19968;&#33268;&#20445;&#35777;&#23601;&#20250;&#31435;&#21363;&#20007;&#22833;</div>
<div class="t-li1"><span class="t-li">2)</span> &#22810;&#25968;&#24773;&#20917;&#19979;&#65292; <code>memory_order_seq_cst</code> &#21407;&#23376;&#25805;&#20316;&#30456;&#23545;&#20110;&#21516;&#19968;&#32447;&#31243;&#25152;&#36827;&#34892;&#30340;&#20854;&#20182;&#21407;&#23376;&#25805;&#20316;&#21487;&#37325;&#25490;</div>
</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
</table>
<p>&#33509;&#22312;&#22810;&#29983;&#20135;&#32773;-&#22810;&#28040;&#36153;&#32773;&#30340;&#24773;&#24418;&#20013;&#65292;&#19988;&#25152;&#26377;&#28040;&#36153;&#32773;&#37117;&#24517;&#39035;&#20197;&#30456;&#21516;&#39034;&#24207;&#35266;&#23519;&#21040;&#25152;&#26377;&#29983;&#20135;&#32773;&#30340;&#21160;&#20316;&#20986;&#29616;&#65292;&#21017;&#21487;&#33021;&#24517;&#39035;&#26377;&#24207;&#21015;&#39034;&#24207;&#12290;</p>
<p>&#20840;&#24207;&#21015;&#39034;&#24207;&#22312;&#25152;&#26377;&#22810;&#26680;&#31995;&#32479;&#19978;&#35201;&#27714;&#23436;&#20840;&#30340;&#20869;&#23384;&#26629;&#26639; CPU &#25351;&#20196;&#12290;&#36825;&#21487;&#33021;&#25104;&#20026;&#24615;&#33021;&#29942;&#39048;&#65292;&#22240;&#20026;&#23427;&#24378;&#21046;&#21463;&#24433;&#21709;&#30340;&#20869;&#23384;&#35775;&#38382;&#20256;&#25773;&#21040;&#27599;&#20010;&#26680;&#24515;&#12290;</p>
<div class="t-example">
<p>&#27492;&#31034;&#20363;&#28436;&#31034;&#24207;&#21015;&#19968;&#30452;&#39034;&#24207;&#20026;&#24517;&#35201;&#30340;&#22330;&#21512;&#12290;&#20219;&#20309;&#20854;&#20182;&#39034;&#24207;&#37117;&#21487;&#33021;&#35302;&#21457;assert&#65292;&#22240;&#20026;&#21487;&#33021;&#20196;&#32447;&#31243;<code>c</code>&#21644;<code>d</code>&#35266;&#27979;&#21040;&#21407;&#23376;&#23545;&#35937;<code>x</code>&#21644;<code>y</code>&#20197;&#30456;&#21453;&#39034;&#24207;&#26356;&#25913;&#12290;</p>
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;thread&gt;</span>
<span class="co2">#include &lt;atomic&gt;</span>
<span class="co2">#include &lt;cassert&gt;</span>
<a href="cpp-atomic-atomic.html"><span class="kw2066">std::<span class="me2">atomic</span></span></a><span class="sy1">&lt;</span><span class="kw4">bool</span><span class="sy1">&gt;</span> x <span class="sy1">=</span> <span class="br0">{</span><span class="kw2">false</span><span class="br0">}</span><span class="sy4">;</span>
<a href="cpp-atomic-atomic.html"><span class="kw2066">std::<span class="me2">atomic</span></span></a><span class="sy1">&lt;</span><span class="kw4">bool</span><span class="sy1">&gt;</span> y <span class="sy1">=</span> <span class="br0">{</span><span class="kw2">false</span><span class="br0">}</span><span class="sy4">;</span>
<a href="cpp-atomic-atomic.html"><span class="kw2066">std::<span class="me2">atomic</span></span></a><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> z <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">0</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">void</span> write_x<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
x.<span class="me1">store</span><span class="br0">(</span><span class="kw2">true</span>, std<span class="sy4">::</span><span class="me2">memory_order_seq_cst</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">void</span> write_y<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
y.<span class="me1">store</span><span class="br0">(</span><span class="kw2">true</span>, std<span class="sy4">::</span><span class="me2">memory_order_seq_cst</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">void</span> read_x_then_y<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">while</span> <span class="br0">(</span><span class="sy3">!</span>x.<span class="me1">load</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">memory_order_seq_cst</span><span class="br0">)</span><span class="br0">)</span>
<span class="sy4">;</span>
<span class="kw1">if</span> <span class="br0">(</span>y.<span class="me1">load</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">memory_order_seq_cst</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span>
<span class="sy2">++</span>z<span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span>
<span class="kw4">void</span> read_y_then_x<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">while</span> <span class="br0">(</span><span class="sy3">!</span>y.<span class="me1">load</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">memory_order_seq_cst</span><span class="br0">)</span><span class="br0">)</span>
<span class="sy4">;</span>
<span class="kw1">if</span> <span class="br0">(</span>x.<span class="me1">load</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">memory_order_seq_cst</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span>
<span class="sy2">++</span>z<span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<a href="cpp-thread-thread.html"><span class="kw2139">std::<span class="me2">thread</span></span></a> a<span class="br0">(</span>write_x<span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-thread-thread.html"><span class="kw2139">std::<span class="me2">thread</span></span></a> b<span class="br0">(</span>write_y<span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-thread-thread.html"><span class="kw2139">std::<span class="me2">thread</span></span></a> c<span class="br0">(</span>read_x_then_y<span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-thread-thread.html"><span class="kw2139">std::<span class="me2">thread</span></span></a> d<span class="br0">(</span>read_y_then_x<span class="br0">)</span><span class="sy4">;</span>
a.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> b.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> c.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> d.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span>z.<span class="me1">load</span><span class="br0">(</span><span class="br0">)</span> <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">0</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#20915;&#19981;&#21457;&#29983;</span>
<span class="br0">}</span></pre></div>
</div>
</div>
<h3><span class="mw-headline" id=".E4.B8.8E_volatile_.E7.9A.84.E5.85.B3.E7.B3.BB">&#19982; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">volatile</span></span></span> &#30340;&#20851;&#31995;</span></h3>
<p>&#22312;&#25191;&#34892;&#32447;&#31243;&#20013;&#65292;&#19981;&#33021;&#23558;&#36890;&#36807; <a href="cpp-language-cv.html">volatile &#27867;&#24038;&#20540;</a>&#30340;&#35775;&#38382;&#65288;&#35835;&#21644;&#20889;&#65289;&#37325;&#25490;&#21040;&#21516;&#32447;&#31243;&#20869;<i>&#20808;&#24207;&#20110;</i>&#25110;<i>&#21518;&#24207;&#20110;</i>&#23427;&#30340;&#21487;&#35266;&#27979;&#21103;&#25928;&#24212;&#65288;&#21253;&#21547;&#20854;&#20182; volatile &#35775;&#38382;&#65289;&#21518;&#65292;&#20294;&#19981;&#20445;&#35777;&#21478;&#19968;&#32447;&#31243;&#35266;&#23519;&#21040;&#27492;&#39034;&#24207;&#65292;&#22240;&#20026; volatile &#35775;&#38382;&#19981;&#24314;&#31435;&#32447;&#31243;&#38388;&#21516;&#27493;&#12290;</p>
<p>&#21478;&#22806;&#65292; volatile &#35775;&#38382;&#19981;&#26159;&#21407;&#23376;&#30340;&#65288;&#20849;&#26102;&#30340;&#35835;&#21644;&#20889;&#26159;<a href="cpp-language-memory_model.html">&#25968;&#25454;&#31454;&#20105;</a>&#65289;&#65292;&#19988;&#19981;&#25490;&#24207;&#20869;&#23384;&#65288;&#38750; volatile &#20869;&#23384;&#35775;&#38382;&#21487;&#20197;&#33258;&#30001;&#22320;&#37325;&#25490;&#21040; volatile &#35775;&#38382;&#21069;&#21518;&#65289;&#12290;</p>
<p>&#19968;&#20010;&#20540;&#24471;&#27880;&#24847;&#30340;&#20363;&#22806;&#26159; Visual Studio &#65292;&#20854;&#20013;&#40664;&#35748;&#35774;&#32622;&#19979;&#65292;&#27599;&#20010; volatile &#20889;&#25317;&#26377;&#37322;&#25918;&#35821;&#20041;&#65292;&#32780;&#27599;&#20010; volatile &#35835;&#25317;&#26377;&#33719;&#24471;&#35821;&#20041;&#65288; <a rel="nofollow" class="external text" href="http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.100).aspx">MSDN</a> &#65289;&#65292;&#25925;&#32780;&#21487;&#23558; volatile &#23545;&#35937;&#29992;&#20110;&#32447;&#31243;&#38388;&#21516;&#27493;&#12290;&#26631;&#20934;&#30340; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">volatile</span></span></span> &#35821;&#20041;&#19981;&#21487;&#24212;&#29992;&#20110;&#22810;&#32447;&#31243;&#32534;&#31243;&#65292;&#23613;&#31649;&#23427;&#20204;&#22312;&#24212;&#29992;&#21040; <span class="t-c"><span class="mw-geshi cpp source-cpp">sig_atomic_t</span></span> &#23545;&#35937;&#26102;&#65292;&#36275;&#20197;&#19982;&#20363;&#22914;&#36816;&#34892;&#20110;&#21516;&#19968;&#32447;&#31243;&#30340; <span class="t-lc"><a href="cpp-utility-program-signal.html">std::signal</a></span> &#22788;&#29702;&#20989;&#25968;&#20132;&#27969;&#12290;</p>
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">&#21442;&#38405;</span></h3>
<table class="t-dsc-begin"></table>
<h3><span class="mw-headline" id=".E5.A4.96.E9.83.A8.E9.93.BE.E6.8E.A5">&#22806;&#37096;&#38142;&#25509;</span></h3>
<ul>
<li><a href="https://en.wikipedia.org/wiki/MOESI_protocol" class="extiw" title="enwiki:MOESI protocol">MOESI &#21327;&#35758;</a></li>
</ul>
<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;&#25105;&#20204;&#22312; QPI &#12289; MOESI &#21487;&#33021;&#36824;&#26377; Dragon &#19978;&#25214;&#19979;&#22909;&#21442;&#32771;</td>
</tr>
</table>
<ul>
<li><a rel="nofollow" class="external text" href="http://www.cl.cam.ac.uk/~pes20/weakmemory/cacm.pdf">x86-TSO &#65306; x86 &#22810;&#22788;&#29702;&#22120;&#19978;&#20005;&#26684;&#32780;&#26377;&#29992;&#30340;&#31243;&#24207;&#21592;&#27169;&#22411;</a>&#65292;P. Sewell &#31561;&#65292; 2010</li>
<li><a rel="nofollow" class="external text" href="http://www.cl.cam.ac.uk/~pes20/ppc-supplemental/test7.pdf">ARM &#21450; POWER &#23485;&#26494;&#20869;&#23384;&#27169;&#22411;&#30340;&#20837;&#38376;&#25945;&#31243;</a>&#65292; P. Sewell &#31561; &#65292; 2012</li>
<li><a rel="nofollow" class="external text" href="https://researchspace.auckland.ac.nz/bitstream/handle/2292/11594/MESIF-2009.pdf?sequence=6">MESIF &#65306;&#28857;&#23545;&#28857;&#20114;&#32852;&#30340;&#20004;&#36339;&#32531;&#23384;&#19968;&#33268;&#24615;&#21327;&#35758;</a>&#65292; J.R. Goodman, H.H.J. Hum &#65292; 2009</li>
</ul>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>