Skip to content

Commit 182d9fd

Browse files
committed
deploy: d60f646
1 parent 6c620c5 commit 182d9fd

File tree

4 files changed

+17
-7
lines changed

4 files changed

+17
-7
lines changed

cpp_tricks/index.html

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,6 +1282,7 @@ <h2 id="cout">多线程中 cout 出现乱序?</h2>
12821282
</blockquote>
12831283
<p>他们中间可能穿插了其他线程的 cout,从而导致你 <code>"the answer is"</code> 打印完后,被其他线程的 <code>'\n'</code> 插入进来,导致换行混乱。</p>
12841284
<blockquote>
1285+
<p><img src="../img/warning.png" height="30px" width="auto" style="margin: 0; border: none"/> <code>std::cout</code><code>operator&lt;&lt;</code> 调用是线程安全的,不会被打断,但多个 <code>operator&lt;&lt;</code> 的调用在多线程环境中可能会 <strong>交错</strong> ,导致输出结果混乱。</p>
12851286
<p><img src="../img/bulb.png" height="30px" width="auto" style="margin: 0; border: none"/> 更多细节请看我们的 <a href="../threading/">多线程专题</a></p>
12861287
</blockquote>
12871288
<p>解决方法是,先创建一个只属于当前线程的 <code>ostringstream</code>,最后一次性调用一次 cout 的 <code>operator&lt;&lt;</code>,让“原子”的单位变成“一行”而不是一个字符串。</p>
@@ -1292,8 +1293,12 @@ <h2 id="cout">多线程中 cout 出现乱序?</h2>
12921293
<p>或者,使用 <code>std::format</code></p>
12931294
<pre><code class="language-cpp">cout &lt;&lt; std::format(&quot;the answer is {}\n&quot;, 42);
12941295
</code></pre>
1295-
<p>总之,就是要让 <code>operator&lt;&lt;</code> 只有一次。</p>
1296-
<p>建议各位升级到 C++23,然后改用 <code>std::println</code> 吧:</p>
1296+
<p>总之,就是要让 <code>operator&lt;&lt;</code> 只有一次,自然就是没有交错。</p>
1297+
<p>在 C++20 中,可以改用 <code>std::osyncstream(std::cout)</code> 代替 <code>std::cout</code> :</p>
1298+
<pre><code class="language-cpp">std::osyncstream(std::cout) &lt;&lt; &quot;the answer is &quot; &lt;&lt; 42 &lt;&lt; '\n';
1299+
</code></pre>
1300+
<p><code>std::osyncstream</code> 可以保证:1. 不会产生数据竞争;2. 不会发生穿插和截断。可以理解为 <code>std::osyncstream</code> 在构造时对缓冲区上锁,在析构时解锁。</p>
1301+
<p>如果你的标准库支持 C++23,还可以用 <code>std::println</code>,这个函数的输出也是原子的(第三方库如 <code>fmt::println</code> 亦可):</p>
12971302
<pre><code class="language-cpp">std::println(&quot;the answer is {}&quot;, 42);
12981303
</code></pre>
12991304
<h2 id="cerr-cout">cerr 与 cout 的抉择</h2>

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ <h2 id="_1">前言</h2>
292292
<blockquote>
293293
<p><img src="./img/bulb.png" height="30px" width="auto" style="margin: 0; border: none"/> 本书还在持续更新中……要追番的话,可以在 <a href="https://github.com/parallel101/cppguidebook">GitHub</a> 点一下右上角的 “Watch” 按钮,每当小彭老师提交新 commit,GitHub 会向你发送一封电子邮件,提醒你小彭老师更新了。</p>
294294
</blockquote>
295-
<p>更新时间:2024年10月18日 15:46:43 (UTC+08:00)</p>
295+
<p>更新时间:2024年10月18日 15:48:05 (UTC+08:00)</p>
296296
<p><a href="https://parallel101.github.io/cppguidebook">在 GitHub Pages 浏览本书</a> | <a href="https://142857.red/book">在小彭老师自己维护的镜像上浏览本书</a></p>
297297
<h2 id="_2">格式约定</h2>
298298
<blockquote>

print_page/index.html

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ <h2 id="index-_1">前言</h2>
421421
<blockquote>
422422
<p><img src="../img/bulb.png" height="30px" width="auto" style="margin: 0; border: none"/> 本书还在持续更新中……要追番的话,可以在 <a href="https://github.com/parallel101/cppguidebook">GitHub</a> 点一下右上角的 “Watch” 按钮,每当小彭老师提交新 commit,GitHub 会向你发送一封电子邮件,提醒你小彭老师更新了。</p>
423423
</blockquote>
424-
<p>更新时间:2024年10月18日 15:46:43 (UTC+08:00)</p>
424+
<p>更新时间:2024年10月18日 15:48:05 (UTC+08:00)</p>
425425
<p><a href="https://parallel101.github.io/cppguidebook">在 GitHub Pages 浏览本书</a> | <a href="https://142857.red/book">在小彭老师自己维护的镜像上浏览本书</a></p>
426426
<h2 id="index-_2">格式约定</h2>
427427
<blockquote>
@@ -1880,6 +1880,7 @@ <h2 id="cpp_tricks-cout">多线程中 cout 出现乱序?</h2>
18801880
</blockquote>
18811881
<p>他们中间可能穿插了其他线程的 cout,从而导致你 <code>"the answer is"</code> 打印完后,被其他线程的 <code>'\n'</code> 插入进来,导致换行混乱。</p>
18821882
<blockquote>
1883+
<p><img src="../img/warning.png" height="30px" width="auto" style="margin: 0; border: none"/> <code>std::cout</code> 的 <code>operator&lt;&lt;</code> 调用是线程安全的,不会被打断,但多个 <code>operator&lt;&lt;</code> 的调用在多线程环境中可能会 <strong>交错</strong> ,导致输出结果混乱。</p>
18831884
<p><img src="../img/bulb.png" height="30px" width="auto" style="margin: 0; border: none"/> 更多细节请看我们的 <a href="#threading">多线程专题</a>。</p>
18841885
</blockquote>
18851886
<p>解决方法是,先创建一个只属于当前线程的 <code>ostringstream</code>,最后一次性调用一次 cout 的 <code>operator&lt;&lt;</code>,让“原子”的单位变成“一行”而不是一个字符串。</p>
@@ -1890,8 +1891,12 @@ <h2 id="cpp_tricks-cout">多线程中 cout 出现乱序?</h2>
18901891
<p>或者,使用 <code>std::format</code>:</p>
18911892
<pre><code class="language-cpp">cout &lt;&lt; std::format(&quot;the answer is {}\n&quot;, 42);
18921893
</code></pre>
1893-
<p>总之,就是要让 <code>operator&lt;&lt;</code> 只有一次。</p>
1894-
<p>建议各位升级到 C++23,然后改用 <code>std::println</code> 吧:</p>
1894+
<p>总之,就是要让 <code>operator&lt;&lt;</code> 只有一次,自然就是没有交错。</p>
1895+
<p>在 C++20 中,可以改用 <code>std::osyncstream(std::cout)</code> 代替 <code>std::cout</code> :</p>
1896+
<pre><code class="language-cpp">std::osyncstream(std::cout) &lt;&lt; &quot;the answer is &quot; &lt;&lt; 42 &lt;&lt; '\n';
1897+
</code></pre>
1898+
<p><code>std::osyncstream</code> 可以保证:1. 不会产生数据竞争;2. 不会发生穿插和截断。可以理解为 <code>std::osyncstream</code> 在构造时对缓冲区上锁,在析构时解锁。</p>
1899+
<p>如果你的标准库支持 C++23,还可以用 <code>std::println</code>,这个函数的输出也是原子的(第三方库如 <code>fmt::println</code> 亦可):</p>
18951900
<pre><code class="language-cpp">std::println(&quot;the answer is {}&quot;, 42);
18961901
</code></pre>
18971902
<h2 id="cpp_tricks-cerr-cout">cerr 与 cout 的抉择</h2>

search/search_index.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)