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
   30   31   32   33   34   35   36   37