gpt4 book ai didi

c++ - 从线程调用的原子数据成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:44:43 25 4
gpt4 key购买 nike

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

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) 也不会给您任何关于这两个线程的混契约(Contract)时执行的保证。 Standard 说这种情况有一个未定义的行为——你的变量存在数据竞争(不管它是 atomic 还是不是)。

尝试添加一些锁原语(如std::mutex)或改变逻辑以使用特殊的原子函数(如fetch_addexchange 等)。在 cpp-reference 查看更多信息.

关于c++ - 从线程调用的原子数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41273924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com