|
188 | 188 |
|
189 | 189 | <p class="text-right"><small> |
190 | 190 | 最終更新日時(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秒 |
193 | 193 | </span> |
194 | 194 | <br/> |
195 | 195 | <span itemprop="author" itemscope itemtype="http://schema.org/Person"> |
196 | | - <span itemprop="name">Akira Takahashi</span> |
| 196 | + <span itemprop="name">Koichi Murase</span> |
197 | 197 | </span> |
198 | 198 | が更新 |
199 | 199 | </small></p> |
|
235 | 235 | </p> |
236 | 236 | <h2>概要</h2> |
237 | 237 | <p>コンパイラに許可されている最適化の一つに、「プログラムの意味を変えない限りにおいて、メモリアクセスの順番を変えたり、省略したりしてもよい」というものがある。また、マルチコアCPUにおいては、あるCPUコアによるメモリアクセスの順序が他のコアからも同じように見えるとは限らない。このような挙動はマルチスレッドプログラミングにおいて問題になることがある。 |
238 | | -この問題への対処として、C++11では各スレッドの実行に順序付けをするための"happens before"(先行発生)という関係を定義し、それによってあるスレッドでの操作が他スレッドから可視になるか否かを定めている。 |
| 238 | +この問題への対処として、C++11では各スレッドの実行に順序付けをするための「<a class="cpprefjp-defined-word" data-desc="happens before。(異なるスレッド間の) 2つの操作の実行順序を規定する関係">よりも前に発生する</a>」という関係を定義し、それによってあるスレッドでの操作が他スレッドから可視になるか否かを定めている。 |
239 | 239 | atomic変数においては、"release"操作によって書き込まれた値を"acquire"操作によって別のスレッドが読み出した場合に、そのrelease操作とacquire操作の間に順序付けが行われる。以下に例を挙げる。</p> |
240 | 240 | <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"><iostream></a></span><span class="cp"></span> |
241 | 241 | <span class="cp">#include</span> <span class="cpf"><a href="../atomic.html"><atomic></a></span><span class="cp"></span> |
@@ -265,8 +265,8 @@ <h2>概要</h2> |
265 | 265 | <h3>出力</h3> |
266 | 266 | <p><pre><code>3 |
267 | 267 | </code></pre></p> |
268 | | -<p><code><a href="atomic.html">atomic<bool></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<bool></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>」関係)が成立することになる。 |
270 | 270 | (1) → <code>ready.store()</code> → <code>ready.load()</code> → (2) |
271 | 271 | よって、(1)における書き込みが(2)の時点で可視であることが保証される。 |
272 | 272 | このようにしてC++のマルチスレッドプログラムにおける実行順序および可視性を理解することができる。</p> |
|
0 commit comments