/// <summary> /// 동일 자원을 여러 스레드가 공유자원에 접근가능할 때, 공유자원 사용허가를 받은 임의의 스레드가 공유자원을 사용한다. /// (스레드 Start 순서가 아닌, 공유자원이 사용허가 신청을 하고 허가를 받은 스레드) /// </summary> /// <remarks> /// + 모든 스레드에 동일 객체인스턴스 할당 : 동일 객체인스턴스이므로, 스레드마다 객체인스턴스의 멤버변수에 다른 값을 가질 수 없음. /// + 스레드에 각기 다른 객체인스턴스 할당 : 초기값이 공유자원이면 공유되지 않음.(공유자원이 초기값인 경우, 공유자원이 매번 초기값으로 초기화) /// </remarks> /// <param name="args"></param> private static void ThreadStartForLockByMonitor(params int[] args) { Thread[] threads = new Thread[args.Length]; AccountMonitor obj = new AccountMonitor(10000); for (int i = 0; i < args.Length; i++) { //AccountMonitor obj = new AccountMonitor(10000); obj.maxCnt = args[i]; threads[i] = new Thread(obj.ShowData); threads[i].Name = "Thread - " + Convert.ToChar(65 + i); } foreach (var t in threads) { t.Start(); } }
/// <summary> /// 스레드 동기화 /// : 각기 다른 영업장에서 회사 계좌로 입출금 연속처리 /// </summary> private static void ThreadStartForLockByMonitor() { // 3개의 영업장 Thread[] threads = new Thread[3]; // 회사 계좌 AccountMonitor obj = new AccountMonitor(10000); for (int i = 0; i < threads.Length; i++) { threads[i] = new Thread(new ThreadStart(obj.Transactions)); threads[i].Name = $"지점 [{i}]"; } for (int i = 0; i < threads.Length; i++) { threads[i].Start(); } }