我有以下C代码:
...
data[index] = something;
a_write_memory_barrier();
index = new_index;
...
代码不受锁的保护(其他人只读取
data
和index
),我想确保在更新data[index]
之前存储index
在这段代码中有其他变量的内存写入和读取,但它们并不重要,因此GCC可以自由地对它们重新排序(我希望它这样做是为了优化)只要保证data[index]
和index
的顺序就足够了如何实现这一目标? 最佳答案
如果您需要考虑无序执行(您可能在分布式框架中工作),需要考虑负载、存储区和完整的屏障,当然,如果您的体系结构支持TSO(总存储区排序),而您不关心存储屏障,那么您的写操作将按代码中所写的顺序进行。
如果另一方面担心编译器重新排序,可以考虑使用Volatile(google it)
在您的示例存储屏障将解决您的问题中,此类屏障的实现取决于您使用的体系结构和编译器:
例如
对于sparc和gcc编译器:
#define MEMBAR_STORESTORE() asm volatile ("membar #StoreStore":::"memory")
关于c - 在这种情况下最轻的GCC内存屏障是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13216808/