GCC компилирует это:
#include <atomic>
std::atomic<int> a;
int b(0);
void func()
{
b = 2;
a = 1;
}
:
func():
mov DWORD PTR b[rip], 2
mov DWORD PTR a[rip], 1
mfence
ret
Итак, чтобы прояснить для меня вещи:
- Является ли какой-либо другой поток, считающий 'a как 1 гарантированным для чтения' b как 2.
- Почему MFENCE происходит после того, как запись "не раньше".
- Является ли запись "гарантированной" атомной (в узком смысле, не относящейся к С++), так или иначе, и это относится ко всем процессорам Intel? Я так полагаю из этого выходного кода.
Кроме того, clang (v3.5.1 -O3) делает следующее:
mov dword ptr [rip + b], 2
mov eax, 1
xchg dword ptr [rip + a], eax
ret
Что кажется более простым для моего маленького ума, но почему другой подход, в чем преимущество каждого?