我在多线程程序中使用了一些全局结构,其中一些成员被多个线程同时修改,另一些则不是。
我没有定义任何这个成员的易失性,但是每当我使用这个成员进行读写时,我都会使用原子内置,比如__sync_fetch_and_add。
问题是,我应该定义这个成员还是整个结构的易失性?
我认为编译器必须访问内存,而不是任何寄存器,因为这个内置(lock前缀),我应该担心其他成员不会导致竞争条件。
我检查了我的编译器(gcc 4.6.2)的汇编输出,似乎我的假设是正确的。
这是测试代码。
int sum = 0;
for (i=0; i<2000000000; i++) {
sum += i;
}