原子地读取非原子变量?

时间:2015-05-30 15:16:38

标签: c++ multithreading performance x86 atomic

我有一个非原子62位双精度数,它在一个线程中定期递增。此访问不需要是原子的。但是,此变量偶尔会被另一个线程读取(不写入)。如果我将变量对齐到64位边界,则读取是原子的。

但是,有什么方法可以确保我在增量期间不会读取变量?我可以调用串行化管道的CPU指令吗?记忆障碍?

我想在我的关键线程中声明变量atomic并使用select from tableName(并且在稀有线程中使用更严格的内存屏障),但它看起来同样昂贵。

1 个答案:

答案 0 :(得分:3)

由于您标记了x86,因此这将是x86特定的。

增量基本上是三个部分,读取,添加,写入。增量不是原子的,但是只要变量不跨越高速缓存行边界(这个条件比必须对齐的那么弱),所有三个步骤(添加不计算,我认为,无论如何都不可观察)对于它的自然对齐,它就像P6一样,在四字之前必须对齐)。

所以你已经看不懂破损的价值了。你能做的最糟糕的事情就是在读取它的时刻和写入新值之间覆盖变量,但你只是在阅读它。