웹 개발/네트워크
[C#] 비동기 프로그래밍_스레드 동기
배세
2023. 9. 20. 23:31
- num이라는 변수를 선언해서 10만씩 더하는 프로그램.
- 두 개의 스레드를 생성하여 결과값은 20만이 나올 것으로 예상.
public static void Run() {
int num = 0;
Thread t1 = new Thread(() => {
for (int i=0; i < 100000; i++) {
num++;
}
});
t1.Start();
Thread t2 = new Thread(() => {
for (int i = 0; i < 100000; i++) {
num++;
}
});
t2.Start();
t1.Join();
t2.Join();
Console.WriteLine(num);
}
결과
왜 결과값이 20만이 아닐까?
크리티컬 섹션 : 여러 스레드가 동시에 동일한 변수에 접근하면서 문제가 발생.
=> 한 번에 두개 이상의 스레드가 접근할 수 없도록 막아야 하는데 이를 스레드 동기화라 한다.
- 모니터를 사용해 동기화할 구간을 설정한다.
- 하나의 객체가 모니터를 사용하는 동안 다른 객체는 대기하게 된다. 결과를 확인해보면 20만이 출력된다.
public static void ThreadAsyncRun() {
int num = 0;
object obj = new object();
Thread t1 = new Thread(() => {
for (int i = 0; i < 100000; i++) {
try {
Monitor.Enter(obj); //동기화할 구간 설정
num++;
}
finally {
Monitor.Exit(obj);
}
}
});
t1.Start();
Thread t2 = new Thread(() => {
for (int i = 0; i < 100000; i++) {
try {
Monitor.Enter(obj); // 하나의 객체가 모니터를 사용하는 동안 다른 객체는 대기한다.
num++;
}
finally {
Monitor.Exit(obj);
}
}
});
t2.Start();
t1.Join();
t2.Join();
Console.WriteLine(num);
}