
C++でマルチスレッド環境での開発をしています。
構造体のそれぞれのデータを保護したいために、スレッドセーフな構造体を
定義したいと思っているのですが、どのようにすれば一番効率的に排他制御ができるでしょうか?
typdedef struct _DATA
{
int i;
double b;
char c;
}
DATA;
たとえば、上のような構造体であれば、それぞれの変数をガードしたいと考えています。
構造体をクラスでラップする方法も考えたのですが、今一つピンと来ません。
もし便利なライブラリがあれば、ライブラリ名と使い方などを教えて頂ければ幸いです。
どうぞよろしくお願いします。
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メンバ関数を用いてのみ値を操作することができます。
No.3
- 回答日時:
まず左上の検索窓に関連する単語(必要あれは複数)を入力して
過去の質問/回等を参照してください。
(スレッドセーフ、 マルチスレッド ロック 等)
今回の場合、次が参考になります。
http://okwave.jp/qa5340280.html #2, #3
マルチスレッド環境での配列使用について
No.2
- 回答日時:
>スレッドセーフな構造体
意味が分かりません。
スレッドセーフになるようプログラムするんじゃないんですか?
あと、データの入れ物(構造体のようなモノ)として、クラスを
使うというなら、「スレッドセーフなクラス」と言うべきで、
これなら、意味が分からないでもありません。
でも、「スレッドセーフなクラス」になるようにプログラムするのは
プログラマの責任で、データの責任ではありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どこからも呼ばれていない無意...
-
IPアドレスのクラスAを取得して...
-
main()を持つクラスが2つ以上...
-
java eclipse 型に解決できません
-
正規表現を使った小数入力チェ...
-
配列の重複する値とその個数を...
-
重複エラーを解決するには
-
JSPでclassのimport
-
僕の出身中学校は200人同級生が...
-
dllと同じプロジェクトにする方法
-
1 つのヘッダファイルに複数の...
-
3年間同じクラスになる確率
-
プライベートIPの数
-
そんなにお金がなくても年に1度...
-
コンボボックスのマウスホイー...
-
JAVAで他ライブラリのクラスを...
-
SDからHDDへのデータ転送速度
-
標準モジュールとクラスモジュ...
-
クラスモジュールの使い方が詳...
-
reading listsとはどういう意味...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
java eclipse 型に解決できません
-
どこからも呼ばれていない無意...
-
EclipseでJSPのコンパイルエラー
-
そんなにお金がなくても年に1度...
-
複数のクラスで共通した関数を...
-
dllと同じプロジェクトにする方法
-
恋愛
-
UMLのクラス図はmain()も含むん...
-
僕の出身中学校は200人同級生が...
-
配列の重複する値とその個数を...
-
同一パッケージにあるクラスが...
-
IPアドレスの3バイト目の呼び方
-
標準モジュールとクラスモジュ...
-
main()を持つクラスが2つ以上...
-
eclipse でクラスに色
-
共通で使う関数を集めたクラス...
-
VBAもしくはVB6:クラスの中で...
-
Cstring(日本語含む)をcharに...
-
IPアドレスのクラスAを取得して...
-
コンボボックスのマウスホイー...
おすすめ情報