• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:クリティカルセクションの使用箇所について)

クリティカルセクションの使用箇所について

このQ&Aのポイント
  • クリティカルセクションを使用してスレッドセーフな処理を実現する方法について説明します。
  • スレッドAで書き換えが行われる変数とスレッドBからの読み取り専用アクセスがある場合、それらを一つのクリティカルセクションで保護することでスレッドセーフな処理が可能です。
  • スレッドAからしか書き換えが行われない場合でも、その変数と他のスレッドからの参照がある場合には、それらを囲むクリティカルセクションで保護することが重要です。

質問者が選んだベストアンサー

  • ベストアンサー
  • Dodonpa2
  • ベストアンサー率82% (19/23)
回答No.1

そのデータ群に関してはそれでスレッドセーフになると思います。わかりやすくしたければ、共有するデータ群を別クラスにして、そのクラスに同期オブジェクトを埋め込んでやれば記述はすっきりするかもしれません。

LongSecret
質問者

お礼

どうもどうも、ありがとうございます♪ これが確認できればすっきりです。今後も役に立つことは間違いありません。 >共有するデータ群を別クラスにして、そのクラスに同期オブジェクトを埋め込んでやれば記述はすっきりするかもしれません。 なるほど…! 確かに、コスト(最小限の呼び出し)と利便性(関数名などで分かりやすく、かつ見た目上短く表記できる)の両方をとろうとするなら そのためだけにクラスを作ってしまうという手も、状況次第で十分考えられそうですね。 私が質問時に関係性の深い変数といったのは、具体的にはポインタのポインタ(動的確保をする)とその確保時の要素数を示す整数のことでしたが クラスのコンストラクタとデストラクタを利用して、関数の出口が複数ある場合にクリティカルセクションの解除忘れを防ぐ。という別クラスの利用アイデアは、読んだことがあったのですが それについては、今回は頻繁に呼び出される可能性も否定できなかったので、コンストラクタとデストラクタのオーバーヘッドを考えて使っていませんでした。 依然、マルチスレッド用描画(GDI)関連に関しては専用クラスを作ったことがあったのですが、今回保護する変数が2つのみだったので、そこで「別クラスを作る」という方向に対しては思考停止していました。 しかし、そのためのクラスといっても、そういう組み方と限る必要はなく、Dodonpa2さんがおっしゃるように、このことのために独自に作るとすれば、コンストラクタやデストラクタを呼ぶ必要ないように書き、インライン展開で関数呼び出しのオーバーヘッドの可能性を完全に撤廃などできれば コスト面で劣らない書き方も可能(ただし、その場合は分かりやすくするという意味あいのみになるかもしれませんが) あるいは、今回の場合にも流用できる可能性として 「何かを動的配列確保するためのポインタ」と「要素数を示す整数」と「クリティカルセクション」をもつようなtemplateのクラスを、インライン展開をしっかり意識して作っておけば、同じようなことには十分使いまわせるかもしれません。 その辺、どういう手を使うかは、やはりプログラミングの醍醐味ですね。