【くりてぃかるせくしょん】

クリティカルセクション とは?

最終更新:
💡 線路の単線区間――すれ違いできないから1列車ずつ通す!

共有データを操作するコードのうち、複数のスレッドが同時に実行しないよう保護する区間。ミューテックスなどで排他制御し、更新の競合を防ぐ。

📌 このページのポイント
同じロックで共有データを保護 スレッドA スレッドB ロック取得 共有データ操作 解放後の処理 取得を待つ Aが解放するまで ロック取得 共有データ操作 Aが解放 無関係な処理は進められる
時間は左から右へ。同じロックを使う2スレッドの例。Bも保護区間を終えたら解放する。
ひよこ ひよこ
クリティカルセクションって何のこと?
ペンギン先生 ペンギン先生
共有データを扱うコードのうち、同時実行を避ける必要がある区間だよ。単線の線路に列車を1本ずつ通すように、ミューテックスなどのロックで保護するんだ。
ひよこ ひよこ
同時に動くと、どう困るの?
ペンギン先生 ペンギン先生
たとえば値を読んで1を足して書き戻す処理を、ロックなしで2つのスレッドが行うとするね。両方が同じ値を読めば、2回増やしたはずなのに1回分しか残らないことがあるんだ。
ひよこ ひよこ
ロックすれば、それだけで安全?
ペンギン先生 ペンギン先生
同じデータに触れる処理が、対応するロックを守ることが必要だよ。取得してから操作し、終わったら解放するんだ。例外で解放を忘れないよう、C++のlock_guardなど、自動解放の仕組みも使えるよ。
ひよこ ひよこ
保護している間は全スレッドが止まるの?
ペンギン先生 ペンギン先生
待つのは同じロックを必要とするスレッドだよ。関係ない処理は進められるんだ。待ち時間を減らすため保護範囲を必要最小限にし、複数のロックを取るなら取得順序などを設計してデッドロックを防ごう。
ひよこ ひよこ
WindowsのCRITICAL_SECTIONも同じ意味?
ペンギン先生 ペンギン先生
一般の用語はコードの区間を指すけれど、WindowsのCRITICAL_SECTIONは同一プロセス内の排他制御に使う同期オブジェクトだよ。競合時には待機する場合があり、常にカーネルを使わないという意味ではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「クリティカルセクション」って出てきたら「共有データを安全に扱うため、一度に1スレッドにするコード区間」と思えばだいたいOK!
📖 おまけ:英語の意味
「Critical Section」 = 危険区間・臨界区間
💬 Critical(重大な・危険な)+ Section(区間)で「慎重に扱わないと危険なコードの区間」という意味だよ

参考資料

← 用語集にもどる