在这种情况下,轻(重)重GCC记忆屏障是什么?

时间:2012-11-04 07:14:37

标签: c gcc concurrent-programming memory-barriers

我有以下C代码:

...
data[index] = something;
a_write_memory_barrier();
index = new_index;
...

代码不受锁定保护(其他人只需阅读dataindex),我想确保在更新data[index]之前存储index。在这段代码中有内存写入和其他变量的读取,但它们并不重要,因此GCC可以自由地重新排序它们(我希望它可以用于优化)。只需保证data[index]index的顺序就足够了。如何实现a_write_memory_barrier()来实现这一目标?

1 个答案:

答案 0 :(得分:1)

如果您需要关心乱序执行(您可能在分布式框架中工作),那么您需要考虑负载,存储和完全障碍,当然,如果您的架构支持TSO(总商店订购)如果您不关心商店障碍,您的写操作将按照代码中的顺序进行。

如果您从另一方面担心编译器重新排序,请考虑使用Volatile(google it)

在您的示例商店中,屏障将解决您的问题,此类屏障的实现取决于您使用的体系结构和编译器:

e.g。

用于sparc和gcc编译器:

   #define MEMBAR_STORESTORE()  asm volatile ("membar #StoreStore":::"memory")