![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
スレッドAで通常読み書きを行っている、非常に関係性の深い変数が複数あり、それらは書き換えられる場合、同一関数内などでほぼ同時に書き換えられるとき
スレッドBからは全く書き換えは行わず、読み取り専用のアクセスのみをするとし
一つのCRITICAL_SECTIONでそれらを全て保護するとすれば
Aで書き換えを行う(或いはそのための計算)部分は全てを囲み
(つまり全ての変数を囲う)
また、それらの変数がスレッドBから参照される部分は囲む
これでスレッドセーフになり、それ以外は囲う必要はない。
(例えばスレッドAから単に読み取り専用のアクセスをされる場合などは普通にシングルスレッドと同様の考え方で良い)
という考えで問題ないでしょうか?
また、スレッドAからしか書き換えを行わなければ
いくつ読み取り専用の別スレッドが出来たとしても
同様に
Aで書き換えを行う部分と
スレッドCやスレッドD・・・
から参照される部分さえ囲んでおけばスレッドセーフになる
という考えで問題ないでしょうか?
No.1ベストアンサー
- 回答日時:
そのデータ群に関してはそれでスレッドセーフになると思います。
わかりやすくしたければ、共有するデータ群を別クラスにして、そのクラスに同期オブジェクトを埋め込んでやれば記述はすっきりするかもしれません。どうもどうも、ありがとうございます♪
これが確認できればすっきりです。今後も役に立つことは間違いありません。
>共有するデータ群を別クラスにして、そのクラスに同期オブジェクトを埋め込んでやれば記述はすっきりするかもしれません。
なるほど…!
確かに、コスト(最小限の呼び出し)と利便性(関数名などで分かりやすく、かつ見た目上短く表記できる)の両方をとろうとするなら
そのためだけにクラスを作ってしまうという手も、状況次第で十分考えられそうですね。
私が質問時に関係性の深い変数といったのは、具体的にはポインタのポインタ(動的確保をする)とその確保時の要素数を示す整数のことでしたが
クラスのコンストラクタとデストラクタを利用して、関数の出口が複数ある場合にクリティカルセクションの解除忘れを防ぐ。という別クラスの利用アイデアは、読んだことがあったのですが
それについては、今回は頻繁に呼び出される可能性も否定できなかったので、コンストラクタとデストラクタのオーバーヘッドを考えて使っていませんでした。
依然、マルチスレッド用描画(GDI)関連に関しては専用クラスを作ったことがあったのですが、今回保護する変数が2つのみだったので、そこで「別クラスを作る」という方向に対しては思考停止していました。
しかし、そのためのクラスといっても、そういう組み方と限る必要はなく、Dodonpa2さんがおっしゃるように、このことのために独自に作るとすれば、コンストラクタやデストラクタを呼ぶ必要ないように書き、インライン展開で関数呼び出しのオーバーヘッドの可能性を完全に撤廃などできれば
コスト面で劣らない書き方も可能(ただし、その場合は分かりやすくするという意味あいのみになるかもしれませんが)
あるいは、今回の場合にも流用できる可能性として
「何かを動的配列確保するためのポインタ」と「要素数を示す整数」と「クリティカルセクション」をもつようなtemplateのクラスを、インライン展開をしっかり意識して作っておけば、同じようなことには十分使いまわせるかもしれません。
その辺、どういう手を使うかは、やはりプログラミングの醍醐味ですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) エクセル終了が遅くなった 7 2022/04/19 12:11
- その他(パソコン・周辺機器) Windows10でXBOX360用RAPVX-SA用の非公式ドライバがインストール出来ない 1 2023/01/10 19:37
- 法学 全部取得条項付株式の取得と引換えにする株式の発行 申請書について 1 2022/12/21 17:32
- 倫理・人権 酔っ払いが他人にたくさん迷惑を掛けているので、もっとお酒規制を厳しくした方が良いのでは? 2 2022/04/11 11:54
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- 副業・複業 『Webライター』になりたいです。 まずブログSNS副業に興味関心がありました。 そして大きな目標と 14 2023/06/16 14:01
- 数学 数学の証明問題について質問です。 今日私大入試があったのですが、AとBの共通部分となるxの範囲を求め 1 2023/02/10 15:27
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
excelvbaでCreateThreadの動作
-
WaitForSingleObjectの使い方に...
-
スレッドの終了の仕方
-
マルチスレッドについて
-
マルチスレッドプログラミング...
-
スレッドの安全な終了のさせ方
-
CWnd::OnTimerのスレッドの取得
-
スレッドの終了を知りたい(Wind...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
スレッドにて同一メモリの書き...
-
C++でマルチスレッド処理をさせ...
-
Macターミナルで実行中のプログ...
-
sendkeysにてALT+CTRL+INSERTを...
-
プロセスIDからウィンドウハ...
-
C言語で、メモリを解放しないで...
-
バックグラウンドのプロセスの...
-
プロセスIDの取得方法について
-
携帯GPSの世界測地系変換につい...
-
Excelでのセル内容の高速消去方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
WaitForSingleObjectの使い方に...
-
マイクロソフトedge で5チャン...
-
スレッドの安全な終了のさせ方
-
スレッドの終了はどうやるんで...
-
スレッドにて同一メモリの書き...
-
スレッドの監視方法について
-
マルチスレッドについて
-
スレッドの終了の仕方
-
Linuxでスレッド優先度って変え...
-
Windows上で、シグナル(SIGTERM...
-
LinuxでDoEvents()同等機能
-
VB2005 シリアル通信のClose処理
-
待機関数(WaitForMultipleObjec...
-
マルチスレッドプログラミング...
-
_beginthreadexで生成したスレ...
-
msec単位のWait Timerが作れない!
-
別スレッドからメインダイアロ...
-
マルチスレッドのスレッド数を...
-
.NetのBackgroundWorkerクラス...
おすすめ情報