gpt4 book ai didi

c++ - 如何使用 C++ 原子

转载 作者:行者123 更新时间:2023-11-30 04:53:08 29 4
gpt4 key购买 nike

我对 C++ 原子变量感到困惑。如果我有一个原子 x,我想在一个线程中递增并在另一个线程中读取,我可以执行++x 还是必须执行 x.atomic_fetch_add(1)。在读者线程中,我可以做类似 cout << x; 的事情吗?还是我必须执行 cout << x.load()。

如果我有

int x;
atomic<bool> y;

然后在线程一

if (!y)
{
x = 23;
y = true;
}

在第二个线程中

if (y)
{
cout << x;
y = false;
}

是否保证线程二会将(非原子)x 的值视为 23。如果不是,如果我将对 y 的访问权限更改为使用加载和存储,这会有所不同吗?是否保证线程二将看到在线程一将 y 设置为真之前发生的所有非原子操作的结果?

谁能推荐一本能清楚解释这些细节的书。

最佳答案

总而言之,您有两个关于变量 y 的问题要问自己:

  • 当变量在线程之间共享时,操作是否正确完成?

这与操作的原子性有关,即一次完成所有操作。 Atomicity 为您提供此保证

  • 操作完成后,您是否希望所有线程看到相同的操作顺序?在 C++ Concurrency in Action 中引用安东尼威廉姆斯的话

Even if the threads are running the same bit of code, they can disagree on the order of events because of operations in other threads in the absence of specific ordering constraints, because the different CPU caches and internal buffers can hold different values for the same memory

这与 memory order 有关

如评论中所述,您执行的操作具有足够级别的内存顺序来保证您需要的内容。

例如,分配顺序一致性是 memory_order_seq_cst,请参阅链接 link here

希望对你有帮助

关于c++ - 如何使用 C++ 原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53981569/

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