• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:スレッドセーフな構造体の作り方)

C++でマルチスレッド環境のスレッドセーフな構造体の作り方

このQ&Aのポイント
  • C++でマルチスレッド環境で構造体のデータを保護するためには、スレッドセーフな構造体を定義する必要があります。
  • 構造体をクラスでラップする方法も考えられますが、他にどのような方法があるのか、また便利なライブラリがあれば教えてください。
  • スレッドセーフな構造体を効率的に実装するためには、排他制御の手法を適切に選ぶことが重要です。

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.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メンバ関数を用いてのみ値を操作することができます。

sho1get
質問者

お礼

ありがとうございます。 非常にわかりやすいコードを提示していただき理解できました。 参考にさせていただきます。

その他の回答 (3)

  • ninoue
  • ベストアンサー率52% (1288/2437)
回答No.3

まず左上の検索窓に関連する単語(必要あれは複数)を入力して 過去の質問/回等を参照してください。 (スレッドセーフ、 マルチスレッド ロック 等) 今回の場合、次が参考になります。 http://okwave.jp/qa5340280.html #2, #3 マルチスレッド環境での配列使用について 

sho1get
質問者

お礼

上記の参考ページは、私が過去に質問したものです。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

>スレッドセーフな構造体 意味が分かりません。 スレッドセーフになるようプログラムするんじゃないんですか? あと、データの入れ物(構造体のようなモノ)として、クラスを 使うというなら、「スレッドセーフなクラス」と言うべきで、 これなら、意味が分からないでもありません。 でも、「スレッドセーフなクラス」になるようにプログラムするのは プログラマの責任で、データの責任ではありません。

回答No.1

マルチスレッドの書き方なんて プラットフォームによって異なると思うけど・・・。 C++0xをサポートしてるんなら別だけど。

関連するQ&A

専門家に質問してみよう