using System;
using System.Threading;
using System.Threading.Tasks;
namespace ServerCore
{
class Program
{
static int x = 0;
static int y = 0;
static int r1 = 0;
static int r2 = 0;
static void Thread_1()
{
y = 1;
r1 = x;
}
static void Thread_2()
{
x = 1;
r2 = y;
}
static void Main(string[] args)
{
Console.WriteLine("Hello, ServerCore");
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}번만에 빠져나옴!");
}
}
}
자 이제 생각해보자. 과연 r1과 r2가 0이 되어 무한루프를 탈출 할 수 있는지?
?!
????!!!!

결과는 어떻게든 무한루프를 탈출하여 결과를 출력한다는 것...
이게 어떻게 가능한 일 일까?

바로 여기에서 y=1 과 r1=x라는 식은 아무런 연관성이 없기 때문에 속도향상을 위해 순서를 바꾸면서 이런 일이 가능해진 것. 싱글스레드에서는 가능한 일이다. 하지만 멀티스레드에서는 큰 문제가 되는 현상이기 때문에 "메모리 배리어"가 필요하게 된다.
이렇게 하면 순서를 바꿀 일이 없기 때문에, 더 이상 r1==0, r2==0일 경우의 수가 없게 된다.
즉, 메모리 배리어는 코드 재배치 억제와 가시성에 도움을 준다.