共享变量的竞争条件

时间:2012-04-17 22:29:19

标签: c++ multithreading atomic

我有一个double类型的共享变量。这个变量将由两个线程访问。一个线程将只编写变量,而另一个线程将只读取变量。

我还能在这里得到比赛条件吗?如果是的话,C ++中是否有一种“简单”的方式来实现原子访问?如果有更多的读取而不是写入,我如何有效地实现它?我是否需要将变量标记为volatile

编辑:好的“阅读器”线程定期对批量数据进行工作,新值的传播不是时间敏感的。我没有实现我没有好的测试方法的复杂联锁,而是可以声明写入线程将写入的另一个临时变量。然后,当读者完成一个批处理时,它可以将临时值原子传播到实际变量。这会是没有竞争条件的吗?

2 个答案:

答案 0 :(得分:8)

是的,存在竞争条件,因为double变量在大多数处理器上都不是原子的。

使用3个双打(可能是中间有额外填充的数组,以避免错误共享导致性能下降)。

一个由读者拥有,一个由作者拥有,一个正在交付。

写入:写入写入时隙,然后原子地交换(例如,使用InterlockedExchange)写入时隙的指针/索引和切换时隙的索引。由于索引是指针大小或更小,只要变量正确对齐,原子交换就很容易。如果您的平台偶然提供带或不带内存屏障的互锁交换,请使用带有内存屏障的。

要读取:原子地将读取槽的指针/索引与切换变量的索引交换。然后阅读读取插槽。

您实际上也应该包含版本号,因为读取的线程往往会在最新和上一个插槽之间反弹。阅读时,请在交换之前和之后阅读,然后使用更高版本的那个。

或者,在C ++ 11中,只需使用std::atomic

警告:以上内容仅适用于单个编写者/单个阅读器(此问题中的特定情况)。如果您有多个,请考虑读取器 - 写入器锁或类似的保护对变量的所有访问。

答案 1 :(得分:0)

您可能想看一下讨论原始类型的读/写的内容:

Are C++ Reads and Writes of an int Atomic?