C# 멀티 쓰레드(동기화, lock)
C# 멀티 쓰레드(동기화, lock)
멀티쓰레드 환경인 경우 여러 곳에서 같은 객체의 메소드를 호출하는 경우에 예기치 않은 결과가 나타날 수 있다. 어떤 메소드의 사용을 한 쓰레드가 끝난 후 다른 쓰레드가 접근하게 하려면 lock 문을 사용 한다. 다음의 예제를 보도록 하자.
using System; using System.Threading;
public class ThreadTest3 { public string lockString = "Hello"; private object obj = new object(); public void Print(string rank) { //lock을 걸어준 구문은 처음 쓰레드가 끝날때 까지 다른 쓰레드가 접근 금지 lock (obj) { for(int i=0; i < 5; i++) { for(int j=0; j < 5; j++) { Thread.Sleep(100); Console.Write(","); }
Console.WriteLine("{0}{1} ", rank, lockString); } } }
public void FirstWork() { Print("F"); } public void SecondWork() { Print("S"); } }
class TestMain { [MTAThread] public static void Main() { ThreadTest3 t = new ThreadTest3(); Thread first = new Thread(new ThreadStart(t.FirstWork)); Thread second = new Thread(new ThreadStart(t.SecondWork));
first.Start(); second.Start(); } } |