C++ 11 で std::atomic を宣言できるのはプリミティブ データ型だけですか? たとえば、ライブラリ クラス オブジェクトを「原子的に」変更またはアクセスするように宣言することは可能ですか?
たとえば、私は持っているかもしれません
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 を次のように宣言できればいいのですが。
std::atomic<time_point<high_resolution_clock>> foo;
... foo に対するすべての操作がアトミックな方法で実行されるようにします。私のプロジェクトのアプリケーションでは、数十のクラスで宣言された数百のそのような foo 変数が存在する可能性があり、宣言して lock_guard する代わりに、いわば「アトミック」にオブジェクトを変更してアクセスする方がはるかに便利だと思います。いたるところにミューテックス。
これは不可能ですか、それともより良いアプローチがありますか、それともミューテックスと lock_guard をどこでも使用する必要がありますか?
更新:
- テイカーはいますか?私は適切な情報を得るために Web で釣りをしてきましたが、atomic を使用した例が非常に少ないため、どの程度適用できるかはわかりません。