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!"); }