有人可以帮我了解我在这里做错了什么吗?
当我使非原子类的数据成员工作正常。

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_addexchange等)。在cpp-reference上查看更多信息。

09-07 06:02