Notice
Recent Posts
Recent Comments
Link
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

For me

[Server] Lock - 1 본문

Server/Study

[Server] Lock - 1

GiveZero 2023. 4. 26. 14:30

Interlocked의 단점 - 정수만 사용 가능

 

Lock

using System;

namespace Server
{
    class Program
    {
        private static int number = 0;
        private static object _obj = new Object();
        
        static void Thread1()
        {
            for (int i = 0; i < 10000; i++)
            {
                Monitor.Enter(_obj);

                number++;
                
                Monitor.Exit(_obj);
            }
        }

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

                number--;
                
                Monitor.Exit(_obj);
            }
        }
        
        static void Main(string[] args)
        {
            Task t1 = new Task(Thread1);
            Task t2 = new Task(Thread2);
            t1.Start();
            t2.Start();

            Task.WaitAll(t1, t2);

            Console.WriteLine(number);

        }
    }
}

상호 배제 Mutual Exclusive
- Monitor.Enter(obj), Monitor.Exit(obj)
- Enter과 Exit 사이의 작업이 완료될때 까지 다른 곳에서 접근 불가
- 즉, Enter 과 Exit 사이의 작업이 완료될 때 까지 싱글 스레드 라고 생각하고 작업해도 상관 없음

        
단점

- Enter,Exit를 반드시 짝을 맞춰야 하기 때문에 관리하기 어려움
- DeadLock 발생 쉬움 


        
해결방안


1) try{} finally{} 사용

        static void Thread1()
        {
            for (int i = 0; i < 10000; i++)
            {
                try
                {
			Monitor.Enter(_obj);
			number++;
                }
                finally
                {
                    Monitor.Exit(_obj);
                }
           }
        }

 

 2) lock(_obj){ } 키워드 사용 (중요)

        static void Thread1()
        {
            for (int i = 0; i < 10000; i++)
            {
            	lock(_obj)
                {
                	number++;
                }
           }
        }

'Server > Study' 카테고리의 다른 글

[Server] Lock - 3 (SpinLock)  (0) 2023.04.26
[Server] Lock - 2  (0) 2023.04.26
[Server] Interlocked  (1) 2023.04.26
[Server] MemoryBarrier  (0) 2023.04.25
[Server] 컴파일러 최적화 (Release)  (0) 2023.04.25