マルチコアと同期

取得(acquire)と解放(release)の意味を持つメモリ操作について正しいものはどれか。

  1. A取得と解放は、どちらもすべての読み書きを完全に止める最も重いバリアである
  2. B取得はメモリを確保し、解放はメモリをfreeする操作である
  3. C取得の後の読み書きは取得より前に動かず、解放の前の読み書きは解放より後に動かない
答えと解説を見る

正解:C. 取得の後の読み書きは取得より前に動かず、解放の前の読み書きは解放より後に動かない

ロックを取るときの操作は取得、手放すときの操作は解放の意味を持ちます。取得より後の操作はロックを取る前に漏れ出さず、解放より前の操作はロックを手放した後に漏れ出さないので、ロックで守った範囲の読み書きが範囲の中に収まります。両方向を止める完全なバリアより制限が少ないので、ハードウェアは残りの入れ替えを使って性能を保てます。

  • A. 片方向だけを止めるので、完全なバリアより軽いです。
  • B. メモリの確保と解放とは別の意味です。
  • C. 正しい。片側だけを止める、軽い順番の保証です。
この分野を解く 分野ページへ

マルチコアと同期のほかの問題

  1. C言語で、スレッド間で受け渡すフラグ変数にvolatileを付けるだけでは、同期として不十分である理由として正しいものはどれか。
  2. C11の_AtomicやC++11のstd::atomicで、メモリオーダーを指定できるようになっている理由として正しいものはどれか。
  3. 大きなデータ構造全体を1つのロックで守る「粗い粒度のロック」と、部分ごとに別のロックで守る「細かい粒度のロック」を比べた説明として正しいものはどれか。
  4. ロックフリー(lock-free)のアルゴリズムの性質として正しいものはどれか。
  5. クリティカルセクションの説明として正しいものはどれか。