Skip to content

Commit 6285aa0

Browse files
author
cpprefjp-autoupdate
committed
update automatically
1 parent 233140d commit 6285aa0

File tree

13 files changed

+428
-55
lines changed

13 files changed

+428
-55
lines changed

reference/atomic/memory_order.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,12 @@
188188

189189
<p class="text-right"><small>
190190
最終更新日時(UTC):
191-
<span itemprop="datePublished" content="2024-06-11T13:45:38">
192-
2024年06月11日 13時45分38秒
191+
<span itemprop="datePublished" content="2024-11-07T15:59:52">
192+
2024年11月07日 15時59分52秒
193193
</span>
194194
<br/>
195195
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
196-
<span itemprop="name">Akira Takahashi</span>
196+
<span itemprop="name">Koichi Murase</span>
197197
</span>
198198
が更新
199199
</small></p>
@@ -235,7 +235,7 @@
235235
</p>
236236
<h2>概要</h2>
237237
<p>コンパイラに許可されている最適化の一つに、「プログラムの意味を変えない限りにおいて、メモリアクセスの順番を変えたり、省略したりしてもよい」というものがある。また、マルチコアCPUにおいては、あるCPUコアによるメモリアクセスの順序が他のコアからも同じように見えるとは限らない。このような挙動はマルチスレッドプログラミングにおいて問題になることがある。
238-
この問題への対処として、C++11では各スレッドの実行に順序付けをするための"happens before"(先行発生)という関係を定義し、それによってあるスレッドでの操作が他スレッドから可視になるか否かを定めている。
238+
この問題への対処として、C++11では各スレッドの実行に順序付けをするための<a class="cpprefjp-defined-word" data-desc="happens before。(異なるスレッド間の) 2つの操作の実行順序を規定する関係">よりも前に発生する</a>という関係を定義し、それによってあるスレッドでの操作が他スレッドから可視になるか否かを定めている。
239239
atomic変数においては、"release"操作によって書き込まれた値を"acquire"操作によって別のスレッドが読み出した場合に、そのrelease操作とacquire操作の間に順序付けが行われる。以下に例を挙げる。</p>
240240
<p><div class="yata" id="c6c58c78693d493a4c71c837489e75548422c07d"><div class="codehilite"><pre><span></span><code><span class="cp">#include</span> <span class="cpf"><a href="../iostream.html">&lt;iostream&gt;</a></span><span class="cp"></span>
241241
<span class="cp">#include</span> <span class="cpf"><a href="../atomic.html">&lt;atomic&gt;</a></span><span class="cp"></span>
@@ -265,8 +265,8 @@ <h2>概要</h2>
265265
<h3>出力</h3>
266266
<p><pre><code>3
267267
</code></pre></p>
268-
<p><code><a href="atomic.html">atomic&lt;bool&gt;</a></code>型の変数<code>ready</code>への読み書きに注目すると、<code>main()</code>では変数<code>ready</code><code>true</code> を"release"操作として書き込み、<code>f()</code>では"acquire"操作としての読み込みを <code>true</code> が返されるまで繰り返している。よって、<code>f()</code><code>while</code>ループを抜けた時点で、<code>main()</code><code>ready.store()</code><code>f()</code><code>ready.load()</code>の間に順序付け(happens before関係)が成立している。
269-
ここでさらに変数<code>data</code>への読み書き(1), (2)に注目すると、(1)は<code>ready.store()</code>より前、(2)は<code>ready.load()</code>より後にあるので、以下のようなスレッド間の順序付け(happens before関係)が成立することになる。
268+
<p><code><a href="atomic.html">atomic&lt;bool&gt;</a></code>型の変数<code>ready</code>への読み書きに注目すると、<code>main()</code>では変数<code>ready</code><code>true</code> を"release"操作として書き込み、<code>f()</code>では"acquire"操作としての読み込みを <code>true</code> が返されるまで繰り返している。よって、<code>f()</code><code>while</code>ループを抜けた時点で、<code>main()</code><code>ready.store()</code><code>f()</code><code>ready.load()</code>の間に順序付け(<a class="cpprefjp-defined-word" data-desc="happens before。(異なるスレッド間の) 2つの操作の実行順序を規定する関係">よりも前に発生する</a>」関係)が成立している。
269+
ここでさらに変数<code>data</code>への読み書き(1), (2)に注目すると、(1)は<code>ready.store()</code>より前、(2)は<code>ready.load()</code>より後にあるので、以下のようなスレッド間の順序付け(<a class="cpprefjp-defined-word" data-desc="happens before。(異なるスレッド間の) 2つの操作の実行順序を規定する関係">よりも前に発生する</a>」関係)が成立することになる。
270270
(1) → <code>ready.store()</code><code>ready.load()</code> → (2)
271271
よって、(1)における書き込みが(2)の時点で可視であることが保証される。
272272
このようにしてC++のマルチスレッドプログラムにおける実行順序および可視性を理解することができる。</p>

reference/barrier/barrier.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,12 @@
188188

189189
<p class="text-right"><small>
190190
最終更新日時(UTC):
191-
<span itemprop="datePublished" content="2024-06-11T13:45:38">
192-
2024年06月11日 13時45分38秒
191+
<span itemprop="datePublished" content="2024-11-07T15:59:52">
192+
2024年11月07日 15時59分52秒
193193
</span>
194194
<br/>
195195
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
196-
<span itemprop="name">Akira Takahashi</span>
196+
<span itemprop="name">Koichi Murase</span>
197197
</span>
198198
が更新
199199
</small></p>
@@ -246,7 +246,7 @@ <h3>詳細説明</h3>
246246
<li>完了関数を呼び出す。<code>completion()</code>と等価。</li>
247247
<li>フェーズ同期ポイント上でブロックされている全スレッドのブロックを解除する。</li>
248248
</ul>
249-
<p>完了ステップの終了は、完了ステップによりブロック解除される全ての関数呼び出しからの復帰よりも、確実に前に発生(strongly happens before)する
249+
<p>完了ステップの終了は、完了ステップによりブロック解除される全ての関数呼び出しからの復帰<strong><a class="cpprefjp-defined-word" data-desc="strongly happens before。(異なるスレッド間の) 2つの操作の実行順序を規定する強い関係">よりも確実に前に発生する</a></strong>
250250
テンプレートパラメータ<code>CompletionFunction</code>のデフォルト値以外の特殊化においては、完了ステップの進行中にバリアオブジェクトの<code><a href="barrier/wait.html">wait()</a></code>を除くメンバ関数が呼び出されると、その<a class="cpprefjp-defined-word" data-desc="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。" href="../../implementation-compliance.html#dfn-undefined-behavior">動作は未定義</a>となる。</p>
251251
<p>テンプレートパラメータ<code>CompletionFunction</code>のデフォルト値は、追加で Cpp17DefaultConstructible 要件を満たす<a class="cpprefjp-defined-word" data-desc="未規定の動作。事前の断りなく処理系によって異なる動作をする" href="../../implementation-compliance.html#dfn-unspecified-behavior">未規定</a>の型であり、式<code>completion()</code>は何の副作用も生じない。
252252
つまりテンプレートパラメータを省略した<code>barrier&lt;&gt;</code>オブジェクトでは、各フェーズ完了時に追加的な処理を行わない。</p>

reference/syncstream/basic_syncbuf/emit.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,8 @@
200200

201201
<p class="text-right"><small>
202202
最終更新日時(UTC):
203-
<span itemprop="datePublished" content="2024-11-08T10:41:31">
204-
2024年11月08日 10時41分31秒
203+
<span itemprop="datePublished" content="2024-11-18T05:36:09">
204+
2024年11月18日 05時36分09秒
205205
</span>
206206
<br/>
207207
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
@@ -243,8 +243,8 @@ <h2><a class="cpprefjp-defined-word" data-desc="関数呼び出し式の評価
243243
<h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成する要素の1つ。Postconditions。関数を実行後に満たされている条件。契約属性の`[[ensures]]`に相当">事後条件</a></h2>
244244
<p>成功すると、書き込まれた文字データは空になる。</p>
245245
<h2><a class="cpprefjp-defined-word" data-desc="マルチスレッド実行時にリソースの所有権に基づいて実行順序を制御する操作">同期操作</a></h2>
246-
<p>同じストリームバッファオブジェクトに文字を転送するすべての<code>emit()</code>呼び出しは、「happens before」関係と一致する全順序で実行されるように見える。各<code>emit()</code>呼び出しは、その全順序で後続の<code>emit()</code>呼び出しと同期する。実際には、これは下記の備考にあることを意味する。</p>
247-
<p>注:ここでは、happens before 関係は全順序関係になっていると考えられる。また、modification order と矛盾しないとも考えられる。下記の参照を参照のこと。</p>
246+
<p>同じストリームバッファオブジェクトに文字を転送するすべての<code>emit()</code>呼び出しは、「<a class="cpprefjp-defined-word" data-desc="happens before。(異なるスレッド間の) 2つの操作の実行順序を規定する関係">よりも前に発生する</a>」関係と一致する全順序で実行されるように見える。各<code>emit()</code>呼び出しは、その全順序で後続の<code>emit()</code>呼び出し<strong><a class="cpprefjp-defined-word" data-desc="synchronizes with。「A は B に対して同期する」という記述は「A が B よりも前に発生する」関係を保証する">に対して同期する</a></strong>。実際には、これは下記の備考にあることを意味する。</p>
247+
<p>注:ここでは、<a class="cpprefjp-defined-word" data-desc="happens before。(異なるスレッド間の) 2つの操作の実行順序を規定する関係">よりも前に発生する</a>関係は全順序関係になっていると考えられる。また、modification order と矛盾しないとも考えられる。下記の参照を参照のこと。</p>
248248
<h2>備考</h2>
249249
<p>ラップされたストリームに一意に関連付けられたロックを保持しながら、ラップされたストリームのメンバ関数を呼び出すことができる。つまり、同じストリームを持つ他の<code>basic_syncbuf</code>オブジェクトに対してアトミックに転送することができる。</p>
250250
<h2></h2>

reference/thread/jthread/join.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,8 @@
200200

201201
<p class="text-right"><small>
202202
最終更新日時(UTC):
203-
<span itemprop="datePublished" content="2024-11-08T10:41:31">
204-
2024年11月08日 10時41分31秒
203+
<span itemprop="datePublished" content="2024-11-18T05:36:09">
204+
2024年11月18日 05時36分09秒
205205
</span>
206206
<br/>
207207
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
@@ -235,9 +235,9 @@ <h2>要件</h2>
235235
<h2>効果</h2>
236236
<p><code>this</code>に関連付けれられたスレッドが完了するまで、この関数を呼び出したスレッドをブロックする。</p>
237237
<h2><a class="cpprefjp-defined-word" data-desc="マルチスレッド実行時にリソースの所有権に基づいて実行順序を制御する操作">同期操作</a></h2>
238-
<p>関連付けられたスレッドの完了は、<code>join()</code>メンバ関数の正常リターンと <strong>同期する</strong></p>
238+
<p>関連付けられたスレッドの完了は、<code>join()</code>メンバ関数の正常リターン<strong><a class="cpprefjp-defined-word" data-desc="synchronizes with。「A は B に対して同期する」という記述は「A が B よりも前に発生する」関係を保証する">に対して同期する</a></strong></p>
239239
<p>つまり、「<code>this</code>に関連付けられたスレッドT1上で行われる全処理の完了」は、
240-
<code>join()</code>メンバ関数を呼び出したスレッドT0上での同メンバ関数からの正常リターン」よりも <strong>前に発生する</strong></p>
240+
<code>join()</code>メンバ関数を呼び出したスレッドT0上での同メンバ関数からの正常リターン」<strong><a class="cpprefjp-defined-word" data-desc="happens before。(異なるスレッド間の) 2つの操作の実行順序を規定する関係">よりも前に発生する</a></strong></p>
241241
<h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成する要素の1つ。Postconditions。関数を実行後に満たされている条件。契約属性の`[[ensures]]`に相当">事後条件</a></h2>
242242
<p><code>this</code>は何も指さない空の<code>thread</code>オブジェクトとなる。</p>
243243
<h2><a class="cpprefjp-defined-word" data-desc="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態">例外</a></h2>

reference/thread/jthread/op_constructor.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,8 @@
200200

201201
<p class="text-right"><small>
202202
最終更新日時(UTC):
203-
<span itemprop="datePublished" content="2024-11-08T10:41:31">
204-
2024年11月08日 10時41分31秒
203+
<span itemprop="datePublished" content="2024-11-18T05:36:09">
204+
2024年11月18日 05時36分09秒
205205
</span>
206206
<br/>
207207
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
@@ -289,15 +289,15 @@ <h2>効果</h2>
289289
</ul>
290290
<h2><a class="cpprefjp-defined-word" data-desc="マルチスレッド実行時にリソースの所有権に基づいて実行順序を制御する操作">同期操作</a></h2>
291291
<ul>
292-
<li>(2) : コンストラクタ呼び出しの完了は、<code>f</code>のコピーの呼び出し開始と同期する
292+
<li>(2) : コンストラクタ呼び出しの完了は、<code>f</code>のコピーの呼び出し開始<strong><a class="cpprefjp-defined-word" data-desc="synchronizes with。「A は B に対して同期する」という記述は「A が B よりも前に発生する」関係を保証する">に対して同期する</a></strong>
293293
新しいスレッドを生成し、<code><a href="../../concepts/Invoke.html">INVOKE</a>(DECAY_COPY(<a href="../../utility/forward.html">std::forward</a>&lt;F&gt;(f)), DECAY_COPY(<a href="../../utility/forward.html">std::forward</a>&lt;Args&gt;(args))...)</code>を実行する。ただし<code>DECAY_COPY</code>は同コンストラクタを呼び出したスレッド上にて評価される。また<code>f</code>のコピーの<a class="cpprefjp-defined-word" data-desc="関数呼び出し式の評価結果となるオブジェクト・値">戻り値</a>は無視される。<ul>
294294
<li><code>DECAY_COPY(x)</code><code>template &lt;class T&gt; typename std::decay&lt;T&gt;::type decay_copy(T&amp;&amp; v) { return <a href="../../utility/forward.html">std::forward</a>&lt;T&gt;(v); }</code> と定義される。おおよそ、<code>x</code>が配列型なら先頭要素へのポインタ、<code>x</code>が関数型ならその関数ポインタ、<code>x</code>がコピーコンストラクト可能な型なら<code>x</code>からコピーされたオブジェクト、<code>x</code>がムーブコンストラクト可能な型なら<code>x</code>からムーブされたオブジェクトとなる。</li>
295295
</ul>
296296
</li>
297297
</ul>
298298
<h2><a class="cpprefjp-defined-word" data-desc="マルチスレッド実行時にリソースの所有権に基づいて実行順序を制御する操作">同期操作</a></h2>
299299
<ul>
300-
<li>(2) : 同コンストラクタの呼び出し完了は、fのコピーの呼び出し開始と<strong>同期する</strong>。つまり、「コンストラクタ呼び出し側スレッドT0でのコンストラクタ呼び出し完了」は、「新しいスレッド<code>T1</code>上での<code>f</code>のコピーの呼び出し開始」よりも<strong>前に発生する</strong></li>
300+
<li>(2) : 同コンストラクタの呼び出し完了は、fのコピーの呼び出し開始<strong><a class="cpprefjp-defined-word" data-desc="synchronizes with。「A は B に対して同期する」という記述は「A が B よりも前に発生する」関係を保証する">に対して同期する</a></strong>。つまり、「コンストラクタ呼び出し側スレッドT0でのコンストラクタ呼び出し完了」は、「新しいスレッド<code>T1</code>上での<code>f</code>のコピーの呼び出し開始」<strong><a class="cpprefjp-defined-word" data-desc="happens before。(異なるスレッド間の) 2つの操作の実行順序を規定する関係">よりも前に発生する</a></strong></li>
301301
</ul>
302302
<h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成する要素の1つ。Postconditions。関数を実行後に満たされている条件。契約属性の`[[ensures]]`に相当">事後条件</a></h2>
303303
<ul>

reference/thread/this_thread/sleep_for.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,8 @@
200200

201201
<p class="text-right"><small>
202202
最終更新日時(UTC):
203-
<span itemprop="datePublished" content="2024-11-08T10:41:31">
204-
2024年11月08日 10時41分31秒
203+
<span itemprop="datePublished" content="2024-11-18T05:36:09">
204+
2024年11月18日 05時36分09秒
205205
</span>
206206
<br/>
207207
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
@@ -238,7 +238,7 @@ <h2>効果</h2>
238238
<p>引数 <code>rel_time</code>で指定した相対時間だけ現在のスレッド、すなわちこの関数を呼び出したスレッド自身をブロックする。</p>
239239
<p>指定した相対時間 <strong>以上</strong> の時間が経過すると、現スレッドのブロックが解除されて後続処理の実行が開始される。なお、タイマーの精度は処理系依存。</p>
240240
<h2><a class="cpprefjp-defined-word" data-desc="マルチスレッド実行時にリソースの所有権に基づいて実行順序を制御する操作">同期操作</a></h2>
241-
<p>特に他操作と同期しない</p>
241+
<p>特に他操作<a class="cpprefjp-defined-word" data-desc="synchronizes with。「A は B に対して同期する」という記述は「A が B よりも前に発生する」関係を保証する">に対して同期する</a>規定はない</p>
242242
<h2><a class="cpprefjp-defined-word" data-desc="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態">例外</a></h2>
243243
<ul>
244244
<li>C++11 : <code><a href="../../chrono/duration.html">chrono::duration&lt;Rep, Period&gt;</a></code>オブジェクトから<a class="cpprefjp-defined-word" data-desc="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態">例外</a>送出しない限りは、この関数は<a class="cpprefjp-defined-word" data-desc="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態">例外</a>送出しない。</li>

0 commit comments

Comments
 (0)