gpt4 book ai didi

c++ - 是什么让 C++ atomic 成为 atomic

转载 作者:行者123 更新时间:2023-11-30 01:02:03 24 4
gpt4 key购买 nike

我只知道连代码int64_t_variable = 10不是原子操作。例如

int64_t i = 0;
i = 100;

在另一个线程(例如 T2)中,它可能会读取不是 0 的值或 100 .

  1. 以上是真的吗?
  2. std::atomic<int64_t> i; i.store(100, std::memory_order_relaxed)是原子的。那么 atomic 使用什么魔法使它基于 Q1 是真实的?
  3. 我一直认为任何处理少于 64 位的操作都是原子的(假设 64 位 cpu),看来我错了。所以 v = n ,我怎么知道它是否是原子的?例如,如果 v 是 void * , 它是原子的还是非原子的?

==================================

更新:在我的问题中:当 T2 读取 i 时, 0 和 100 对我来说都可以。但任何其他结果都是不合理的。这就是重点。所以我不认为 cpu 缓存或编译器的东西可以实现这一点。

最佳答案

is the above true?

是的。如果您不使用同步(std::atmoic<>std::mutex、...),则您在一个线程中所做的任何更改都不会假定显示在其他线程中。它甚至可能是编译器优化了一些东西,因为它无法改变功能。例如

bool flag = true;

void stop_stuff()
{
flag = false;
}

void do_stuff()
{
while (flag)
std::cout << "never stop";
}

因为 flag 没有同步,编译器可以自由地假设它永远不会改变 optmize 甚至检查循环条件中的标志。如果确实如此,那么无论您调用多少次stop_stuff , do_stuff永远不会结束。

如果将标志更改为 std::atomic<bool> flag ,那么编译器就不能再做出这样的假设,因为你告诉它这个变量可以在函数范围之外改变,它需要被检查。

请注意,当您有多个线程共享数据并且至少有一个线程写入共享数据时,不提供同步称为数据竞争,根据标准,这是未定义的行为。上面的示例只是该未定义行为的一种可能结果。

std::atomic<int64_t> i; i.store(100, std::memory_order_relaxed) is atomic. so what magic does atomic use to make it happen based on Q1 is true?

它要么使用您的系统提供的原子原语,要么使用类似 std::mutex 的锁定机制保护访问权限。

I always think any operation which handles less than 64 bits is atomic (assume 64 bit cpu), looks I was wrong. so for v = n, how I can know if it is atomic or not? for example, if v is void *, is it atomic or not?

虽然这在某些系统上可能是正确的,但对于 C++ 内存模型却不是这样。唯一的原子是 std::atomic<T> .

关于c++ - 是什么让 C++ atomic 成为 atomic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56971327/

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