私は疑問に思っていましたが、プリミティブなデータ型はC++ 11ではstd :: atomicと宣言できますか?ライブラリクラスオブジェクトを "アトミックに"突然変異させたりアクセスしたりすることを宣言することは可能でしょうか?例えばC++ 11プリミティブデータ型のみをアトミックに宣言できますか?
これらのsetterメソッドとgetterメソッドが異なるスレッドで呼び出された場合、私は、
using namespace std::chrono;
time_point<high_resolution_clock> foo;
// setter method
void set_foo() {
foo = high_resolution_clock::now();
}
// getter method
time_point<high_resolution_clock> get_foo() {
return foo;
}
を持っているかもしれませんが、私は未定義の動作を引き起こすかもしれないと思います。私がfooを次のように宣言することができればいいと思います。fooのすべての操作はアトミックなやり方で行われるようになります。私のプロジェクトのためのアプリケーションでは、数十のクラスにまたがって宣言されたfoo変数が数百にも及ぶことがあります。宣言とlock_guardの代わりにオブジェクトを変更して「原子」にアクセスする方がはるかに便利だと思います場所全体にミューテックス。
これはできないのですか、それとも良い方法がありますか、本当にどこでもmutexとlock_guardを使用する必要がありますか?
更新:
- 任意の受験者?私はまともな情報のためにウェブ上で釣りをしてきましたが、原子を使っている例はあまりありません。適用できる範囲を確かめることはできません。
std :: atomicは、壊れたスレッドコードの回避策ではありません。別のスレッドがセッターを呼び出すと、最初に呼び出されたスレッドがゲッターからガベージ値を取得します。 –