Пример #1
0
        static void Main(string[] args)
        {
            //Reader 스레드 시작
            Thread reader = new Thread(ReadQueue);

            reader.Start();

            List <Thread> threads = new List <Thread>();

            //Writer스레드 시작
            for (int i = 0; i < 10; i++)
            {
                var t = new Thread(new ParameterizedThreadStart(WriteQueue));
                t.Start(i);
                threads.Add(t);
            }
            //모든 Writer스레드가 종료될 때까지 대기
            threads.ForEach(p => p.Join());

            running = false;
            //reader종료

            #endregion
            #region Mutex
            //Mutex클래스: Monitor클래스처럼 특정 코드 블럭을 배타적으로 접근시킴, Monitor는 하나의 프로세스 내에서만 사용되는 반면 Mutex는 특정 기기의 프로세스 간에 배타적 접근을 허용할 때 사용됨
            //그래서 Monitor클래스보다 50배나 느리다...
            //2개 스레드 실행
            Thread t1 = new Thread(() => MyClass.AddList(10));
            Thread t2 = new Thread(() => MyClass.AddList(20));
            t1.Start();
            t2.Start();
            //대기
            t1.Join();
            t2.Join();

            using (Mutex m = new Mutex(false, "MutexName1"))
            {
                //뮤텍스 취득을 위해 대기
                if (m.WaitOne(10))
                {
                    MyClass.MyList.Add(30);
                }
                else
                {
                    Console.WriteLine("뮤텍스 배타적 접근 권한을 얻을 수 없습니다");
                }
            }
            MyClass.ShowList();


            //또다른 것..###이게 주 용도임 위의 것은 굳이 뮤텍스를 쓸 필요 없음lock이나 Monitor를 사용하는 것이 나음..
            //하나의 기기에서 하나의 프로세스만 실행되도록..
            //GUID를 사용
            string mtxName = "@@@4-8805-0090--";
            bool   createdNew;
            Mutex  mtx = new Mutex(true, mtxName, out createdNew);
            //이미 해당 뮤텍스가 이미 실행중이라면..? 실행 종료
            if (!createdNew)
            {
                return;
            }
            //그것이 아니라면 실행..!
            MyApp.Launch();
            #endregion
            #region Semaphore
            //Semaphore: 공유된 자원을 지정된 숫자만큼의 스레드가 동시에 접근할 수 있음, lock, Monitor, Mutex모두 한 번에 하나의 스레드가 접근 가능하지만 Semaphore는 접근 가능한 스레드 숫자가 여러개라는 차이가 있음
            SemClass c = new SemClass();

            for (int i = 0; i <= 10; i++)
            {
                //처음에 동시에 5개 실행..
                new Thread(c.Run).Start(i);
            }
            #endregion
            Console.WriteLine("Hello World!");
        }