我想知道,只能在 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;
}
但是,如果在不同的线程中调用这些 setter 和 getter 方法,我认为这可能会导致未定义的行为。如果我可以声明 foo 之类的东西会很好:
std::atomic<time_point<high_resolution_clock>> foo;
...因此对 foo 的所有操作都将以原子方式进行。在我的项目的应用程序中,可能在几十个类中声明了数百个这样的 foo 变量,我觉得可以说让对象变异和访问“原子”会更方便,而不必声明和 lock_guard到处都是互斥锁。
这是不可能的,还是有更好的方法,或者我真的必须在任何地方使用互斥锁和 lock_guard 吗?
更新:
- 有接盘侠吗?我一直在网上寻找体面的信息,但是使用原子的例子太少了,我不能确定它可以应用到什么程度。