3

在下面的代码片段中,当某个值发生变化时,一个线程调用 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];
}
4

2 回答 2

3

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

但即使你声明了你的全局变量,你也会volatile有惊喜。比较的结果取决于缓存行、缓存一致性、部分负载以及许多您无法轻松控制的事情。此外,结果完全依赖于架构。

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

于 2013-08-19T06:20:30.740 回答
1

如果您对无锁线程感兴趣,可以查看此链接。但是,详细了解其预定假设 - 这对于实施非常重要。

于 2013-08-19T06:19:40.343 回答