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