将值从一个线程传输到另一个线程而不使用锁定

时间:2013-08-19 06:08:01

标签: c multithreading

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

2 个答案:

答案 0 :(得分:3)

C标准无法保证这会产生合理的结果。正如您所写的那样,当编译器给人的印象是它知道全局变量的最后存储值时,它甚至可能会受到优化。

但即使你宣布你的全局变量volatile,你也会有惊喜。比较的结果取决于缓存行,缓存一致性,部分加载以及您无法轻易控制的大量内容。此外,结果完全取决于架构。

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

答案 1 :(得分:1)

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