static void TestThread1()
{
x = 1;
Thread.MemoryBarrier();
result1 = y;
}
static void TestThread2()
{
y = 1;
Thread.MemoryBarrier();
result2 = x;
}
관련 없는 변수들을 사용할 때 최적화에 의해 코드 순서가 바뀔 수 있음
=> result1과 result2가 모두 0일 수 있음
이를 MemoryBarrier 함수를 통하여 억제
메모리 배리어
코드 재배치 억제
메모리 갱신(가시성)
full memory barrier
ASM: MFENCE
C#: Thread.MemoryBarrier
Store, Load 모두 막음
store memory barrier
ASM: SFENCE
Store만 막음
load memory barrier
ASM: LFENCE
Load만 막음