Unity

[인프런 강의 정리] Lock 기초

wny0320 2024. 9. 25. 19:04

이 글은 아래 강의를 정리한 글이다

 

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 강의 | Rookiss - 인프런

Rookiss | 네트워크/멀티쓰레드/운영체제 등 핵심 전공 지식을 공부하고 게임 서버를 바닥부터 만들어보면서 MMORPG 기술을 학습하는 강의입니다., MMORPG 개발에 필요한 모든 기술, C# + Unity로 Step By St

www.inflearn.com

해당 정리글을 한번에 보고 싶다면 아래 링크를 참조하길 바란다

 

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 | Notion

서버OT

mesquite-prune-8c9.notion.site


Lock 기초

InterLocked는 딱 하나 단점이 정수 연산밖에 되질 않는다.

 

Lock 중에 Monitor에 대해 설명

더보기
using System;
using System.Threading;
using System.Threading.Tasks;

namespace ServerCore
{
    class Program
    {
        static int number = 0;
        static object _obj = new object();
        static void Thread_1()
        {
            for (int i = 0; i < 100000; i++)
            {
                // 상호배제 Mutual Exclusive
                Monitor.Enter(_obj);
                // 문을 잠금

                number++;

                Monitor.Exit(_obj);
                // 잠금을 품

                // 직접적으로 사용하면 관리하기 어려운 단점이 있음
                // 예시로 Monitor.Exit를 안하고 return 할 경우 프로그램이 끝나지 않음
                // DeadLock 교착 상황이 발생하게 됨

                // Critical Section, 임계 영역에 대한 언급
            }
        }
        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);
        }
    }
}

직접적으로 관리하기 어렵기 떄문에 lock이라는 키워드를 사용하여 lock을 관리

 

lock 실습

더보기
using System;
using System.Threading;
using System.Threading.Tasks;

namespace ServerCore
{
    class Program
    {
        static int number = 0;
        static object _obj = new object();
        static void Thread_1()
        {
            for (int i = 0; i < 100000; i++)
            {
                lock (_obj)
                {
                    number++;
                }
            }
        }
        static void Thread_2()
        {
            for (int i = 0; i < 100000; i++)
            {
                lock (_obj)
                {
                    number--;
                }
            }
        }
        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);
        }
    }
}