![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- C言語・C++・C# C言語 2 2022/07/21 00:02
- Visual Basic(VBA) M365環境での動作エラー、及び対応相談 1 2023/01/27 04:18
- 化学 大学化学について質問です。専攻されている方、わかる方いる人いたら教えていただけると嬉しいです。 エチ 1 2022/05/10 11:30
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/15 08:30
- ダイヤルアップ Raspberry Piでアナログモデム経由で音声再生 1 2022/05/20 18:01
- 化学 構造式とは(ジエチルエーテル) 3 2022/11/24 11:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
包丁の切れ味
-
UMLのクラス図はmain()も含むん...
-
java eclipse 型に解決できません
-
新規契約でUQモバイル申し込も...
-
重複エラーを解決するには
-
複数のクラスで共通した関数を...
-
進学校通ってたんですけど、眼...
-
クラスの打ち上げって、なぜク...
-
クラスにアクセスできません。
-
配列の重複する値とその個数を...
-
IPアドレスのクラスAを取得して...
-
main()を持つクラスが2つ以上...
-
グローバルIPとプライベートIP...
-
VC++ MFCButton マウスが通過す...
-
CImageクラスをVisualC++6.0で...
-
USBデバイスのクラスID
-
どこからも呼ばれていない無意...
-
A・B・Cクラスとは?
-
エクセルVBAでのwitheventsにつ...
-
クラスのプロパティに構造体を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の重複する値とその個数を...
-
「天声人語」をインターネット...
-
java eclipse 型に解決できません
-
グローバルIPとプライベートIP...
-
ポータブル電源を買おうと思う...
-
容姿について
-
自作のクラスファイルがインポ...
-
どこからも呼ばれていない無意...
-
UMLのクラス図はmain()も含むん...
-
同一パッケージにあるクラスが...
-
main()を持つクラスが2つ以上...
-
1 つのヘッダファイルに複数の...
-
アルキメデスの大戦の櫂はなぜ2...
-
dllと同じプロジェクトにする方法
-
IPアドレスの3バイト目の呼び方
-
3年間同じクラスになる確率
-
重複エラーを解決するには
-
同じパッケージ、クラス名が含...
-
コンボボックスのマウスホイー...
-
同じクラスにならない確率を教...
おすすめ情報