在下面的代码片段中,当某个值发生更改时,线程会调用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];
}
答案 0 :(得分:3)
C标准无法保证这会产生合理的结果。正如您所写的那样,当编译器给人的印象是它知道全局变量的最后存储值时,它甚至可能会受到优化。
但即使你宣布你的全局变量volatile
,你也会有惊喜。比较的结果取决于缓存行,缓存一致性,部分加载以及您无法轻易控制的大量内容。此外,结果完全取决于架构。
Modern C,AKA C11,_Atomic
用于您想要实现的任务,并且所有现代处理器都支持原子功能。使用这些,或通过互斥锁,读写锁或类似工具保护您的变量。
答案 1 :(得分:1)
如果您对无锁线程感兴趣,那么您可以查看link。但是,详细了解其预定的假设 - 这对于实施非常重要。