본문 바로가기
프로그래밍/c#

[c#] 쓰레드 동기화 클래스 2(Mutex, Semaphore)

by 그래도동 2019. 10. 8.
728x90
반응형

이전글

[c#] 쓰레드 동기화 클래스 1(Lock, Monitor)

 

1. Mutex

 Mutex는 Monitor와 비슷하지만 한 프로세스 내 뿐만 아니라 프로세스간에서도 Locking이 가능하다.

하지만 Monitor Locking에 비해 50배 정도 느리므로 한 프로세스 내에서 Lock이 필요한 경우는 Lock이나 Monitor를 쓴다.

Mutex를 using문으로 감쌌다고 해서 lock처럼 생각하면 안된다. mutex.ReleaseMutex를 사용해서 해제해야한다.

using System;
using System.Threading;

namespace ThreadSafe
{
    class Program
    {
        private static int baby = 0;
        private static object lockObj = new object();

        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                new Thread(CountBaby).Start();
            }
        }

        private static void CountBaby()
        {
            using (Mutex m = new Mutex(false, "MutexName"))
            {
                if (m.WaitOne(1000))
                {
                    baby++;
                    Console.WriteLine(baby);
                }
                else
                {
                    Console.WriteLine("뮤텍스를 취득할 수 없습니다.");
                }
                m.ReleaseMutex();
            }
        }
    }
}

 

결과 값

이전의 게시글인 Lock과 Monitor의 결과 값과 동일하고 releaseMutex()를 사용하지 않았을 때의 결과 값을 확인해 보자.

이런식으로 취득할 수 없다가 에러가 뜬다. 

 

 

2. Semaphore

 이 클래스는 공유된 리소스를 지정된 수의 쓰레드들만 엑세스하게 허용한다. (복수개 허용 가능하단말이다.)

10개를 사용한다면 11번째 쓰레드는 저 10개 쓰레드 중 누군가 작업이 끝나야 리소스를 사용할 수 있게 된다.

using System;
using System.Threading;

namespace ThreadSafe
{
    class Program
    {
        private static int baby = 0;

        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                new Thread(CountBaby).Start();
            }
        }

        private static void CountBaby()
        {
            Semaphore s = new Semaphore(5, 5); // 처음 요청 개수, 최대 요청 개수
            s.WaitOne();  // 5개만 들어온다.
             
            baby++;
            Console.WriteLine( baby);
            Thread.Sleep(400);

            s.Release(); // 1개 해제 -> 다음 쓰레드 들어올 수 있다.
        }
    }
}

 

결과값

 

5개가 동시에 들어오므로 1~10까지 순차적이지 않을 수 있다.

 

 

 

 

참고

http://www.csharpstudy.com

728x90
반응형

댓글