2

我有以下 C 代码:

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

该代码不受锁保护(其他人只是读取dataindex),我想确保data[index]在更新index. 这段代码周围有其他变量的内存写入和读取,但它们并不重要,因此 GCC 可以自由地重新排序它们(我希望这样做是为了优化)。只要保证data[index]and的顺序index就足够了。应该如何a_write_memory_barrier()实施才能实现这一目标?

4

1 回答 1

1

如果您需要关心乱序执行(您可能在分布式框架中工作),那么您需要考虑 load load , store store 和 full barrier ,当然如果您的架构支持 TSO (total store ordering)而不是您不'不关心存储障碍,您的写入操作将按照代码中的顺序进行。

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

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

例如

对于 sparc 和 gcc 编译器:

   #define MEMBAR_STORESTORE()  asm volatile ("membar #StoreStore":::"memory")
于 2012-11-04T07:22:58.067 回答