電子書籍の厳選無料作品が豊富!

C++でマルチスレッド環境での開発をしています。

構造体のそれぞれのデータを保護したいために、スレッドセーフな構造体を

定義したいと思っているのですが、どのようにすれば一番効率的に排他制御ができるでしょうか?

typdedef struct _DATA
{
int i;
double b;
char c;
}
DATA;

たとえば、上のような構造体であれば、それぞれの変数をガードしたいと考えています。

構造体をクラスでラップする方法も考えたのですが、今一つピンと来ません。

もし便利なライブラリがあれば、ライブラリ名と使い方などを教えて頂ければ幸いです。

どうぞよろしくお願いします。

A 回答 (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メンバ関数を用いてのみ値を操作することができます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/10/14 13:39

まず左上の検索窓に関連する単語(必要あれは複数)を入力して


過去の質問/回等を参照してください。
(スレッドセーフ、 マルチスレッド ロック 等)

今回の場合、次が参考になります。
http://okwave.jp/qa5340280.html #2, #3
マルチスレッド環境での配列使用について 
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/10/14 13:40

>スレッドセーフな構造体


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

マルチスレッドの書き方なんて


プラットフォームによって異なると思うけど・・・。
C++0xをサポートしてるんなら別だけど。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!