🙇‍♀️Lock 기초

동시 다발적으로 접근하면 문제가 되는 코드 : 임계영역

임계영역을 해결하기위한 Lock!

상호 배제적이다

🪐Monitor

문을 잠그고 일련의 행위를 한후 문을 풀어준다는 개념

문을 잠근뒤에는 싱글쓰레드로 생각해서 코딩하면 됨

문을 풀어주는 것이 인셉션, 실수 등으로 못할경우 문제가 됨 - 데드락 (DeadLock)

static int number = 0;
static object _obj = new object();

static void Thread_1()
{
    // atomic = 원자성

    for (int i = 0; i < 100000; i++)
    {
        // 상호배제 Mutual Exclusive
        
        // 윈도우 : CriticalSection, c++ : std::mutex
        Monitor.Enter(_obj); // 문을 감구는 행위

        number++;

        Monitor.Exit(_obj); // 잠금을 풀어준다
    }
}

static void Thread_2()
{
    for (int i = 0; i < 100000; i++)
    {
        Monitor.Enter(_obj);

        number--;

        Monitor.Exit(_obj);
    }
}

static void Main(string[] args)
{
    Task t1 = new Task(Thread_1);
    Task t2 = new Task(Thread_2);
    t1.Start();
    t2.Start();

    Task.WaitAll(t1, t2);

    Console.WriteLine(number);
}

각 언어마다 잠그고 풀어주는 역할을 하는 애들이 존재

  • window - CriticalSection , c++ - std::mutex

🪐Lock

Monitor.Enter와 Monitor.Exit를 자동적으로 해주는 개념

_obj가 자물쇠 역할을 함

for (int i = 0; i < 100000; i++)
{
    lock (_obj)
    {
        number++;
    }
}

태그:

카테고리:

업데이트: