웹 개발/네트워크

[C#] 비동기 프로그래밍_스레드 동기

배세 2023. 9. 20. 23:31
  • num이라는 변수를 선언해서 10만씩 더하는 프로그램.
  • 두 개의 스레드를 생성하여 결과값은 20만이 나올 것으로 예상. 
 public static void Run() {
            int num = 0;

            Thread t1 = new Thread(() => {
                for (int i=0; i < 100000; i++) {
                    num++;
                }
            });

            t1.Start();

            Thread t2 = new Thread(() => {
                for (int i = 0; i < 100000; i++) {
                    num++;
                }

            });
            t2.Start();

            t1.Join();
            t2.Join();
            Console.WriteLine(num);
        
        }

결과

왜 결과값이 20만이 아닐까?

크리티컬 섹션 : 여러 스레드가 동시에 동일한 변수에 접근하면서 문제가 발생.

=> 한 번에 두개 이상의 스레드가 접근할 수 없도록 막아야 하는데 이를 스레드 동기화라 한다. 

 

  • 모니터를 사용해 동기화할 구간을 설정한다. 
  • 하나의 객체가 모니터를 사용하는 동안 다른 객체는 대기하게 된다. 결과를 확인해보면 20만이 출력된다. 
public static void ThreadAsyncRun() {
            int num = 0;

            object obj = new object();

            Thread t1 = new Thread(() => {
                for (int i = 0; i < 100000; i++) {

                    try {
                        Monitor.Enter(obj); //동기화할 구간 설정
                        num++;
                    }
                    finally {
                        Monitor.Exit(obj);
                    }
               
                }
            });

            t1.Start();

            Thread t2 = new Thread(() => {
                for (int i = 0; i < 100000; i++) {
                    try {
                        Monitor.Enter(obj); // 하나의 객체가 모니터를 사용하는 동안 다른 객체는 대기한다.
                        num++;
                    }
                    finally {
                        Monitor.Exit(obj);
                    }
                }

            });
            t2.Start();

            t1.Join();
            t2.Join();
            Console.WriteLine(num);

        }