gpt4 book ai didi

c - 无锁地将一个值从一个线程传输到另一个线程

转载 作者:行者123 更新时间:2023-12-03 12:45:43 25 4
gpt4 key购买 nike

在下面的代码片段中,当某个值发生变化时,一个线程调用 SetValue(),另一个线程调用 GetValue() 来检索该值。我的问题是,在任何情况下 GetValue() 会返回虚假结果吗?

double g_value[2];

// Thread one calls this to set the value
void SetValue( double value )
{
g_value[0] = value;
g_value[1] = value;
}

// Thread two calls this to get the value
double GetValue()
{
double value[2];
do
{
value[0] = g_value[0];
value[1] = g_value[1];
}
while ( value[0] != value[1] );

return value[0];
}

最佳答案

C 标准不保证这会导致合理的结果。正如您所写的那样,当编译器认为它知道全局变量的最后存储值时,它甚至可能需要优化。

但即使您声明了全局变量 volatile,您也可能会感到意外。比较的结果取决于缓存行、缓存一致性、部分加载和许多您无法轻易控制的因素。此外,结果完全依赖于架构。

现代 C,又名 C11,具有 _Atomic 用于您要实现的任务,并且所有现代处理器都支持原子功能。使用这些,或通过互斥锁、读写锁或类似方式保护您的变量。

关于c - 无锁地将一个值从一个线程传输到另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18307339/

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