有人可以帮我了解我在这里做错了什么吗?
当我使非原子类的数据成员工作正常。
class AtomicTest
{
atomic<int> A{ 0 };
atomic<int> B{ 0 };
public :
AtomicTest() { }
void func1()
{
A = 1;
cout << "func1 " << A << endl;;
}
void func2()
{
cout << "func2 " << A << endl;
A = A + 1;
cout << A << endl;
}
};
int main()
{
AtomicTest a;
thread t1(&AtomicTest::func1, std::ref(a)); // I tried to move as well, i know ref would share data between two threads but i can use mutex to protect data if its needed but i cannot even call the func1
//thread t2(&AtomicTest::func2, std::ref(a));
t1.join();
//t2.join();
return 0;
}
最佳答案
由于并发时没有其他同步,因此无法预测程序行为:
A = A + 1;
这行简单的代码包含1个原子
load
和1个原子store
操作。即使是默认的内存顺序(std::memory_order_seq_cst
)也无法保证您可以同时执行这两个线程。 Standard表示这种情况具有不确定的行为-变量存在数据争用(是否为atomic
无关紧要)。尝试添加一些锁定原语(例如
std::mutex
)或更改逻辑以使用特殊的原子函数(例如fetch_add
,exchange
等)。在cpp-reference上查看更多信息。