Memory Barrier?

littleDev·2024년 5월 29일

Server

목록 보기
1/2
post-thumbnail
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라는 식은 아무런 연관성이 없기 때문에 속도향상을 위해 순서를 바꾸면서 이런 일이 가능해진 것. 싱글스레드에서는 가능한 일이다. 하지만 멀티스레드에서는 큰 문제가 되는 현상이기 때문에 "메모리 배리어"가 필요하게 된다.

  1. Full Memory Barrier (Store, Load 모두 순서 제어)
    업로드중..
    2.Store Memory Barrier (Store 순서 제어)
    3.Load Memory Barrier (Load순서 제어)

이렇게 하면 순서를 바꿀 일이 없기 때문에, 더 이상 r1==0, r2==0일 경우의 수가 없게 된다.

즉, 메모리 배리어는 코드 재배치 억제와 가시성에 도움을 준다.

profile
매일 성장하고싶은 개발자

0개의 댓글