VisualStudio/C#서버
[C#서버][개념] 메모리 베리어( Memory Barrier)
usingsystem
2022. 10. 26. 13:31
728x90
※개념만 알아둘것
메모리 베리어 (Rock처리안할 경우)
멀티스레드 환경에서 메모리순서가 강제로 변경된다. 이때 메모리 순서 변경을 막기위한 방법
1. 코드 재배치 억제
1) Full Memory Barrier(어셈블리 MFENCE, C# Thread.MemoryBarrier) - Store/Load 둘다 막는다.
2) Store Memory Barrier(어셈블리 SFENCE - Store 막는다)
3) Load Memory Barrier(어셈블리 LFENCE - Load 막는다)
2. 가시성
static int x = 0;
static int y = 0;
static int r1 = 0;
static int r2 = 0;
static void Thread_1()
{
y = 1;
//Thread.MemoryBarrier(); 메모리베리어 사용시 메모리의 순서가 변하지 않는다.
r1 = x;
}
static void Thread_2()
{
x = 1;
//Thread.MemoryBarrier(); 메모리베리어 사용시 메모리의 순서가 변하지 않는다.
r2 = y;
}
static void Main(string[] args)
{
int count = 0;
while (true)
{
count++;
x = y = r1 = r2 = 0;
Task t1 = new Task(Thread_1);
Task t2 = new Task(Thread_2);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
if(r1==0 && r2 == 0)
{
break;
}
}
Console.WriteLine(count);
}
728x90