我有以下C代码:
...
data[index] = something;
a_write_memory_barrier();
index = new_index;
...
代码不受锁定保护(其他人只需阅读data
和index
),我想确保在更新data[index]
之前存储index
。在这段代码中有内存写入和其他变量的读取,但它们并不重要,因此GCC可以自由地重新排序它们(我希望它可以用于优化)。只需保证data[index]
和index
的顺序就足够了。如何实现a_write_memory_barrier()
来实现这一目标?
答案 0 :(得分:1)
如果您需要关心乱序执行(您可能在分布式框架中工作),那么您需要考虑负载,存储和完全障碍,当然,如果您的架构支持TSO(总商店订购)如果您不关心商店障碍,您的写操作将按照代码中的顺序进行。
如果您从另一方面担心编译器重新排序,请考虑使用Volatile(google it)
在您的示例商店中,屏障将解决您的问题,此类屏障的实现取决于您使用的体系结构和编译器:
e.g。
用于sparc和gcc编译器:
#define MEMBAR_STORESTORE() asm volatile ("membar #StoreStore":::"memory")