gpt4 book ai didi

multithreading - 在没有同步或原子性的情况下访问不同线程中的 64 位变量

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

我有两个线程共享一个 uint64_t 变量。第一个线程只是从变量中读取,而另一个线程只是写入。如果我不使用互斥锁/自旋锁/原子操作等同步它们,是否有可能从写入的写入线程中读取另一个值?读取由写入线程写入的旧值并不重要。

例如,写线程在 0 到 100 之间增加变量,读线程打印该值。那么,是否有可能在屏幕中看到不同于 [0-100] 范围的值。目前我没有看到任何不同的值,但我不确定它会导致竞争条件。

提前致谢。

最佳答案

在 64 位处理器上,数据一次传输 64 位,因此您将看到逻辑上一致的值,即您不会看到写入之前的 32 位和写入之后的 32 位。这显然不适用于 32 位处理器。

您将看到的问题是,如果两个线程在不同的核心上运行,则在写入线程的核心刷新其缓存之前,读取线程将看不到写入线程所做的更改。此外,优化可能会使任一线程在循环中根本不需要读取内存。例如,如果您有:

uint64_t x = 0;

void increment()
{
for (int i = 0 ; i < 100 ; ++i)
{
x++;
}
}

编译器可能会生成读取 x 的代码。在循环开始时将其写入寄存器,并且在循环退出之前不会将其写回内存。您需要诸如 volatile 之类的东西和内存障碍。

关于multithreading - 在没有同步或原子性的情况下访问不同线程中的 64 位变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48561999/

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