Page 35 -
P. 35
x = 2
# 스레드 1
t1 = x // t1 = 2
t1 = t1 + 3 // t1 = 5 1
x = t1 // x = 5
# 스레드 2 멀티스레딩
t2 = x // t2 = 5
t2 = t2 + 4 // t2 = 9
x = t2 // x = 9
우리가 원하는 결과가 나오네요. 하지만 이렇게 실행된다면 어떻게 될까요?
x = 2
# 스레드 1
t1 = x // t1 = 2
t1 = t1 + 3 // t1 = 5
# 스레드 2
t2 = x // t2 = 2
t2 = t2 + 4 // t2 = 6
x = t2 // x = 6
# 스레드 1
x = t1 // x = 5
x에는 9가 아닌 5가 들어갑니다. 슬프게도 컨텍스트 스위치가 무작위로(random) 발생하다 보니 결
과를 예측할 수 없습니다.
자, 그러면 소수 구하는 프로그램에서 어느 부분이 잘못되었는지 짚어 볼까요?
그림 1-22 아까 다루었던 소수 구하는 프로그램
int num = 1;
main() Array<int> primes;
{
Array<Thread> threads;
for (i = 0; i < 4; i++)
threads.Add(BeginThread(ThreadProc)); ThreadProc()
{
for (i = 0; i < 4; i++) while (num <= 1000000)
{ {
threads.WaitForExit(); if (IsPrime(num))
} primes.Add(num);
PrintNumbers(primes); num++;
} }
}
043