- ベストアンサー
C++でマルチスレッド環境のスレッドセーフな構造体の作り方
- C++でマルチスレッド環境で構造体のデータを保護するためには、スレッドセーフな構造体を定義する必要があります。
- 構造体をクラスでラップする方法も考えられますが、他にどのような方法があるのか、また便利なライブラリがあれば教えてください。
- スレッドセーフな構造体を効率的に実装するためには、排他制御の手法を適切に選ぶことが重要です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでしょうか? template <class T, class Sync> class sync_value { public: T get() const { typename Sync::lock_type lock(syncid_); return value_; } void set(const T& value) { typename Sync::lock_type lock(syncid_); value_ = value; } private: volatile T value_; typename Sync::id_type syncid_; }; template <class Sync> struct DATA { sync_value<int, Sync> i; sync_value<double, Sync> b; sync_value<char, Sync> c; }; テンプレート引数Syncに渡す型は、処理系に応じてlock_typeクラスおよびid_type型を定義してやる必要があります。 Sync::lock_typeクラスは、コンストラクタでロックをかけ、デストラクタで解除するようにしてください。 DATA構造体の各メンバi, b, cは、getおよびsetメンバ関数を用いてのみ値を操作することができます。
その他の回答 (3)
- ninoue
- ベストアンサー率52% (1288/2437)
まず左上の検索窓に関連する単語(必要あれは複数)を入力して 過去の質問/回等を参照してください。 (スレッドセーフ、 マルチスレッド ロック 等) 今回の場合、次が参考になります。 http://okwave.jp/qa5340280.html #2, #3 マルチスレッド環境での配列使用について
お礼
上記の参考ページは、私が過去に質問したものです。
- nda23
- ベストアンサー率54% (777/1415)
>スレッドセーフな構造体 意味が分かりません。 スレッドセーフになるようプログラムするんじゃないんですか? あと、データの入れ物(構造体のようなモノ)として、クラスを 使うというなら、「スレッドセーフなクラス」と言うべきで、 これなら、意味が分からないでもありません。 でも、「スレッドセーフなクラス」になるようにプログラムするのは プログラマの責任で、データの責任ではありません。
- ICE_FALCON
- ベストアンサー率56% (63/111)
マルチスレッドの書き方なんて プラットフォームによって異なると思うけど・・・。 C++0xをサポートしてるんなら別だけど。
お礼
ありがとうございます。 非常にわかりやすいコードを提示していただき理解できました。 参考にさせていただきます。