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

250 lines
27 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::hardware_destructive_interference_size, std::hardware_constructive_interference_size</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_thread_hardware_destructive_interference_size 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>hardware_destructive_interference_size, <span style="font-size:0.7em; line-height:130%">std::</span>hardware_constructive_interference_size</h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="cpp.html">cpp</a>&lrm; | <a href="cpp-thread.html">thread</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-new.html">&lt;new&gt;</a></code></div>
</td>
<td></td>
<td></td>
</tr>
<tr class="t-dcl t-since-cxx17">
<td>
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">inline</span> <span class="kw4">constexpr</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><br />
&nbsp; &nbsp; hardware_destructive_interference_size <span class="sy1">=</span> <span class="coMULTI">/*implementation-defined*/</span><span class="sy4">;</span></span></div>
</td>
<td>(1)</td>
<td><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></td>
</tr>
<tr class="t-dcl t-since-cxx17">
<td>
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">inline</span> <span class="kw4">constexpr</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><br />
&nbsp; &nbsp; hardware_constructive_interference_size <span class="sy1">=</span> <span class="coMULTI">/*implementation-defined*/</span><span class="sy4">;</span></span></div>
</td>
<td>(2)</td>
<td><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></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> &#20108;&#20010;&#23545;&#35937;&#38388;&#36991;&#20813;&#20551;&#25968;&#25454;&#20849;&#20139;&#30340;&#26368;&#23567;&#20559;&#31227;&#12290;&#20445;&#35777;&#33267;&#23569;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp">alignof<span class="br0">(</span><a href="cpp-types-max_align_t.html"><span class="kw104">std::<span class="me2">max_align_t</span></span></a><span class="br0">)</span></span></span>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> keep_apart <span class="br0">{</span>
alignas<span class="br0">(</span>std<span class="sy4">::</span><span class="me2">hardware_destructive_interference_size</span><span class="br0">)</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> cat<span class="sy4">;</span>
alignas<span class="br0">(</span>std<span class="sy4">::</span><span class="me2">hardware_destructive_interference_size</span><span class="br0">)</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> dog<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">2)</span> &#40723;&#21169;&#30495;&#20849;&#20139;&#30340;&#26368;&#22823;&#36830;&#32493;&#20869;&#23384;&#22823;&#23567;&#12290;&#20445;&#35777;&#33267;&#23569;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp">alignof<span class="br0">(</span><a href="cpp-types-max_align_t.html"><span class="kw104">std::<span class="me2">max_align_t</span></span></a><span class="br0">)</span></span></span>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> together <span class="br0">{</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> dog<span class="sy4">;</span>
<span class="kw4">int</span> puppy<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> kennel <span class="br0">{</span>
<span class="co1">// &#20854;&#20182;&#25968;&#25454;&#25104;&#21592;&hellip;&hellip;</span>
alignas<span class="br0">(</span>sizeof<span class="br0">(</span>together<span class="br0">)</span><span class="br0">)</span> together pack<span class="sy4">;</span>
<span class="co1">// &#20854;&#20182;&#25968;&#25454;&#25104;&#21592;&hellip;&hellip;</span>
<span class="br0">}</span><span class="sy4">;</span>
static_assert<span class="br0">(</span>sizeof<span class="br0">(</span>together<span class="br0">)</span> <span class="sy1">&lt;=</span> std<span class="sy4">::</span><span class="me2">hardware_constructive_interference_size</span><span class="br0">)</span><span class="sy4">;</span></pre></div>
</div>
</div>
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">&#27880;&#35299;</span></h3>
<p>&#36825;&#20123;&#24120;&#37327;&#25552;&#20379;&#19968;&#31181;&#21487;&#31227;&#26893;&#30340;&#35775;&#38382; L1 &#25968;&#25454;&#32531;&#23384;&#32447;&#22823;&#23567;&#30340;&#26041;&#24335;&#12290;</p>
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">&#31034;&#20363;</span></h3>
<div class="t-example">
<p>&#31243;&#24207;&#20351;&#29992;&#20108;&#20010;&#32447;&#31243;&#65288;&#21407;&#23376;&#22320;&#65289;&#20889;&#20837;&#32473;&#23450;&#20840;&#23616;&#23545;&#35937;&#30340;&#25968;&#25454;&#25104;&#21592;&#12290;&#31532;&#19968;&#20010;&#23545;&#35937;&#36866;&#21512;&#19968;&#26465;&#32531;&#23384;&#32447;&#65292;&#36825;&#23548;&#33268;&ldquo;&#30828;&#20214;&#24178;&#28041;&rdquo;&#12290;&#31532;&#20108;&#20010;&#23545;&#35937;&#20445;&#25345;&#20854;&#25968;&#25454;&#25104;&#21592;&#22312;&#20998;&#31163;&#30340;&#32531;&#23384;&#32447;&#19978;&#65292;&#25925;&#36991;&#20813;&#20102;&#32447;&#31243;&#20889;&#20837;&#21518;&#21487;&#33021;&#30340;&ldquo;&#32531;&#23384;&#21516;&#27493;&rdquo;&#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;atomic&gt;</span>
<span class="co2">#include &lt;chrono&gt;</span>
<span class="co2">#include &lt;cstddef&gt;</span>
<span class="co2">#include &lt;iomanip&gt;</span>
<span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;mutex&gt;</span>
<span class="co2">#include &lt;new&gt;</span>
<span class="co2">#include &lt;thread&gt;</span>
<span class="co2">#ifdef __cpp_lib_hardware_interference_size</span>
<span class="kw1">using</span> std<span class="sy4">::</span><span class="me2">hardware_constructive_interference_size</span><span class="sy4">;</span>
<span class="kw1">using</span> std<span class="sy4">::</span><span class="me2">hardware_destructive_interference_size</span><span class="sy4">;</span>
<span class="co2">#else</span>
<span class="co1">// &#22312; x86-64 &#9474; L1_CACHE_BYTES &#9474; L1_CACHE_SHIFT &#9474; __cacheline_aligned &#9474; ... &#19978;&#20026; 64 &#23383;&#33410;</span>
<span class="kw4">constexpr</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> hardware_constructive_interference_size <span class="sy1">=</span> <span class="nu0">64</span><span class="sy4">;</span>
<span class="kw4">constexpr</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> hardware_destructive_interference_size <span class="sy1">=</span> <span class="nu0">64</span><span class="sy4">;</span>
<span class="co2">#endif</span>
<a href="cpp-thread-mutex.html"><span class="kw2152">std::<span class="me2">mutex</span></span></a> cout_mutex<span class="sy4">;</span>
<span class="kw4">constexpr</span> <span class="kw4">int</span> max_write_iterations<span class="br0">{</span><span class="nu0">10</span><span class="st0">&#39;000&#39;</span><span class="nu8">000</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#24615;&#33021;&#35780;&#20272;&#26102;&#38388;&#35843;&#33410;</span>
<span class="kw1">struct</span> alignas<span class="br0">(</span>hardware_constructive_interference_size<span class="br0">)</span>
OneCacheLiner <span class="br0">{</span> <span class="co1">// &#21344;&#25454;&#19968;&#26465;&#32531;&#23384;&#32447;</span>
<a href="cpp-atomic-atomic.html"><span class="kw2123">std::<span class="me2">atomic_uint64_t</span></span></a> x<span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<a href="cpp-atomic-atomic.html"><span class="kw2123">std::<span class="me2">atomic_uint64_t</span></span></a> y<span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span> oneCacheLiner<span class="sy4">;</span>
<span class="kw1">struct</span> TwoCacheLiner <span class="br0">{</span> <span class="co1">// &#21344;&#25454;&#20108;&#26465;&#32531;&#23384;&#32447;</span>
alignas<span class="br0">(</span>hardware_destructive_interference_size<span class="br0">)</span> <a href="cpp-atomic-atomic.html"><span class="kw2123">std::<span class="me2">atomic_uint64_t</span></span></a> x<span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
alignas<span class="br0">(</span>hardware_destructive_interference_size<span class="br0">)</span> <a href="cpp-atomic-atomic.html"><span class="kw2123">std::<span class="me2">atomic_uint64_t</span></span></a> y<span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span> twoCacheLiner<span class="sy4">;</span>
<span class="kw1">inline</span> <span class="kw4">auto</span> now<span class="br0">(</span><span class="br0">)</span> <span class="kw1">noexcept</span> <span class="br0">{</span> <span class="kw1">return</span> std<span class="sy4">::</span><span class="me2">chrono</span><span class="sy4">::</span><span class="me2">high_resolution_clock</span><span class="sy4">::</span><span class="me2">now</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">bool</span> xy<span class="sy1">&gt;</span>
<span class="kw4">void</span> oneCacheLinerThread<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw4">const</span> <span class="kw4">auto</span> start <span class="br0">{</span> now<span class="br0">(</span><span class="br0">)</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">for</span> <span class="br0">(</span>uint64_t count<span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> count <span class="sy3">!</span><span class="sy1">=</span> max_write_iterations<span class="sy4">;</span> <span class="sy2">++</span>count<span class="br0">)</span>
<span class="kw1">if</span> <span class="kw4">constexpr</span> <span class="br0">(</span>xy<span class="br0">)</span>
oneCacheLiner.<span class="me1">x</span>.<span class="me1">fetch_add</span><span class="br0">(</span><span class="nu0">1</span>, <a href="cpp-atomic-memory_order.html"><span class="kw2093">std::<span class="me2">memory_order_relaxed</span></span></a><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">else</span> oneCacheLiner.<span class="me1">y</span>.<span class="me1">fetch_add</span><span class="br0">(</span><span class="nu0">1</span>, <a href="cpp-atomic-memory_order.html"><span class="kw2093">std::<span class="me2">memory_order_relaxed</span></span></a><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">const</span> <a href="cpp-chrono-duration.html"><span class="kw993">std::<span class="me2">chrono</span><span class="sy4">::</span><span class="me2">duration</span></span></a><span class="sy1">&lt;</span><span class="kw4">double</span>, <a href="cpp-numeric-ratio-ratio.html"><span class="kw1528">std::<span class="me2">milli</span></span></a><span class="sy1">&gt;</span> elapsed <span class="br0">{</span> now<span class="br0">(</span><span class="br0">)</span> <span class="sy2">-</span> start <span class="br0">}</span><span class="sy4">;</span>
<a href="cpp-thread-lock_guard.html"><span class="kw2164">std::<span class="me2">lock_guard</span></span></a> lk<span class="br0">{</span>cout_mutex<span class="br0">}</span><span class="sy4">;</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;oneCacheLinerThread() spent &quot;</span> <span class="sy1">&lt;&lt;</span> elapsed.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot; ms<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="kw1">if</span> <span class="kw4">constexpr</span> <span class="br0">(</span>xy<span class="br0">)</span>
oneCacheLiner.<span class="me1">x</span> <span class="sy1">=</span> elapsed.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">else</span> oneCacheLiner.<span class="me1">y</span> <span class="sy1">=</span> elapsed.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">bool</span> xy<span class="sy1">&gt;</span>
<span class="kw4">void</span> twoCacheLinerThread<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw4">const</span> <span class="kw4">auto</span> start <span class="br0">{</span> now<span class="br0">(</span><span class="br0">)</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">for</span> <span class="br0">(</span>uint64_t count<span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> count <span class="sy3">!</span><span class="sy1">=</span> max_write_iterations<span class="sy4">;</span> <span class="sy2">++</span>count<span class="br0">)</span>
<span class="kw1">if</span> <span class="kw4">constexpr</span> <span class="br0">(</span>xy<span class="br0">)</span>
twoCacheLiner.<span class="me1">x</span>.<span class="me1">fetch_add</span><span class="br0">(</span><span class="nu0">1</span>, <a href="cpp-atomic-memory_order.html"><span class="kw2093">std::<span class="me2">memory_order_relaxed</span></span></a><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">else</span> twoCacheLiner.<span class="me1">y</span>.<span class="me1">fetch_add</span><span class="br0">(</span><span class="nu0">1</span>, <a href="cpp-atomic-memory_order.html"><span class="kw2093">std::<span class="me2">memory_order_relaxed</span></span></a><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">const</span> <a href="cpp-chrono-duration.html"><span class="kw993">std::<span class="me2">chrono</span><span class="sy4">::</span><span class="me2">duration</span></span></a><span class="sy1">&lt;</span><span class="kw4">double</span>, <a href="cpp-numeric-ratio-ratio.html"><span class="kw1528">std::<span class="me2">milli</span></span></a><span class="sy1">&gt;</span> elapsed <span class="br0">{</span> now<span class="br0">(</span><span class="br0">)</span> <span class="sy2">-</span> start <span class="br0">}</span><span class="sy4">;</span>
<a href="cpp-thread-lock_guard.html"><span class="kw2164">std::<span class="me2">lock_guard</span></span></a> lk<span class="br0">{</span>cout_mutex<span class="br0">}</span><span class="sy4">;</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;twoCacheLinerThread() spent &quot;</span> <span class="sy1">&lt;&lt;</span> elapsed.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot; ms<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="kw1">if</span> <span class="kw4">constexpr</span> <span class="br0">(</span>xy<span class="br0">)</span>
twoCacheLiner.<span class="me1">x</span> <span class="sy1">=</span> elapsed.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">else</span> twoCacheLiner.<span class="me1">y</span> <span class="sy1">=</span> elapsed.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</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-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;__cpp_lib_hardware_interference_size &quot;</span>
<span class="co2"># ifdef __cpp_lib_hardware_interference_size</span>
<span class="st0">&quot; = &quot;</span> <span class="sy1">&lt;&lt;</span> __cpp_lib_hardware_interference_size <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="co2"># else</span>
<span class="st0">&quot;is not defined, use 64 as fallback<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="co2"># endif</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;hardware_destructive_interference_size == &quot;</span>
<span class="sy1">&lt;&lt;</span> hardware_destructive_interference_size <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span>
<span class="sy1">&lt;&lt;</span> <span class="st0">&quot;hardware_constructive_interference_size == &quot;</span>
<span class="sy1">&lt;&lt;</span> hardware_constructive_interference_size <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;<span class="es1">\n</span><span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a>
<span class="sy1">&lt;&lt;</span> <a href="cpp-io-manip-fixed.html"><span class="kw1784">std::<span class="me2">fixed</span></span></a> <span class="sy1">&lt;&lt;</span> <a href="cpp-io-manip-setprecision.html"><span class="kw1796">std::<span class="me2">setprecision</span></span></a><span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span>
<span class="sy1">&lt;&lt;</span> <span class="st0">&quot;sizeof( OneCacheLiner ) == &quot;</span> <span class="sy1">&lt;&lt;</span> sizeof<span class="br0">(</span> OneCacheLiner <span class="br0">)</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span>
<span class="sy1">&lt;&lt;</span> <span class="st0">&quot;sizeof( TwoCacheLiner ) == &quot;</span> <span class="sy1">&lt;&lt;</span> sizeof<span class="br0">(</span> TwoCacheLiner <span class="br0">)</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;<span class="es1">\n</span><span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="kw4">constexpr</span> <span class="kw4">int</span> max_runs<span class="br0">{</span><span class="nu0">4</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> oneCacheLiner_average<span class="br0">{</span><span class="nu0">0</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">auto</span> i<span class="br0">{</span><span class="nu0">0</span><span class="br0">}</span><span class="sy4">;</span> i <span class="sy3">!</span><span class="sy1">=</span> max_runs<span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">)</span> <span class="br0">{</span>
<a href="cpp-thread-thread.html"><span class="kw2146">std::<span class="me2">thread</span></span></a> th1<span class="br0">{</span>oneCacheLinerThread<span class="sy1">&lt;</span><span class="nu0">0</span><span class="sy1">&gt;</span><span class="br0">}</span><span class="sy4">;</span>
<a href="cpp-thread-thread.html"><span class="kw2146">std::<span class="me2">thread</span></span></a> th2<span class="br0">{</span>oneCacheLinerThread<span class="sy1">&lt;</span><span class="nu0">1</span><span class="sy1">&gt;</span><span class="br0">}</span><span class="sy4">;</span>
th1.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> th2.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
oneCacheLiner_average <span class="sy2">+</span><span class="sy1">=</span> oneCacheLiner.<span class="me1">x</span> <span class="sy2">+</span> oneCacheLiner.<span class="me1">y</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;Average time: &quot;</span> <span class="sy1">&lt;&lt;</span> <span class="br0">(</span>oneCacheLiner_average <span class="sy2">/</span> max_runs <span class="sy2">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot; ms<span class="es1">\n</span><span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="kw4">int</span> twoCacheLiner_average<span class="br0">{</span><span class="nu0">0</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">auto</span> i<span class="br0">{</span><span class="nu0">0</span><span class="br0">}</span><span class="sy4">;</span> i <span class="sy3">!</span><span class="sy1">=</span> max_runs<span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">)</span> <span class="br0">{</span>
<a href="cpp-thread-thread.html"><span class="kw2146">std::<span class="me2">thread</span></span></a> th1<span class="br0">{</span>twoCacheLinerThread<span class="sy1">&lt;</span><span class="nu0">0</span><span class="sy1">&gt;</span><span class="br0">}</span><span class="sy4">;</span>
<a href="cpp-thread-thread.html"><span class="kw2146">std::<span class="me2">thread</span></span></a> th2<span class="br0">{</span>twoCacheLinerThread<span class="sy1">&lt;</span><span class="nu0">1</span><span class="sy1">&gt;</span><span class="br0">}</span><span class="sy4">;</span>
th1.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> th2.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
twoCacheLiner_average <span class="sy2">+</span><span class="sy1">=</span> twoCacheLiner.<span class="me1">x</span> <span class="sy2">+</span> twoCacheLiner.<span class="me1">y</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;Average time: &quot;</span> <span class="sy1">&lt;&lt;</span> <span class="br0">(</span>twoCacheLiner_average <span class="sy2">/</span> max_runs <span class="sy2">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot; ms<span class="es1">\n</span><span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#21487;&#33021;&#30340;&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">__cpp_lib_hardware_interference_size is not defined, use 64 as fallback
hardware_destructive_interference_size == 64
hardware_constructive_interference_size == 64
sizeof( OneCacheLiner ) == 64
sizeof( TwoCacheLiner ) == 128
oneCacheLinerThread() spent 634.25 ms
oneCacheLinerThread() spent 651.55 ms
oneCacheLinerThread() spent 990.23 ms
oneCacheLinerThread() spent 1033.94 ms
oneCacheLinerThread() spent 838.14 ms
oneCacheLinerThread() spent 883.25 ms
oneCacheLinerThread() spent 873.02 ms
oneCacheLinerThread() spent 914.26 ms
Average time: 852 ms
twoCacheLinerThread() spent 119.22 ms
twoCacheLinerThread() spent 127.91 ms
twoCacheLinerThread() spent 114.17 ms
twoCacheLinerThread() spent 126.41 ms
twoCacheLinerThread() spent 125.17 ms
twoCacheLinerThread() spent 126.06 ms
twoCacheLinerThread() spent 117.94 ms
twoCacheLinerThread() spent 129.03 ms
Average time: 122 ms</pre></div>
</div>
</div>
<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-thread-thread-hardware_concurrency.html"><span class="t-lines"><span>hardware_concurrency</span></span></a></div>
<div><span class="t-lines"><span><span class="t-cmark">[&#38745;&#24577;]</span></span></span></div>
</div>
</td>
<td>&#36820;&#22238;&#23454;&#29616;&#25903;&#25345;&#30340;&#24182;&#21457;&#32447;&#31243;&#25968;<br />
<span class="t-mark">(<code>std::thread</code> &#30340;&#20844;&#24320;&#38745;&#24577;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="cpp-thread-jthread-hardware_concurrency.html"><span class="t-lines"><span>hardware_concurrency</span></span></a></div>
<div><span class="t-lines"><span><span class="t-cmark">[&#38745;&#24577;]</span></span></span></div>
</div>
</td>
<td>&#36820;&#22238;&#23454;&#29616;&#25903;&#25345;&#30340;&#24182;&#21457;&#32447;&#31243;&#25968;<br />
<span class="t-mark">(<code>std::jthread</code> &#30340;&#20844;&#24320;&#38745;&#24577;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
</table>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>