Page 70 - 4989
P. 70

const int N = 4096;
                  Основний  потік  може  запустити  кілька  таких  потоків  з

            різними  покажчиками,  наприклад  для  паралельної  обробки
            елементів великого масиву.
                  Код в основному потоці:


                   const int NTHREADS = 4;
                   double data[N * NTHREADS];
                   HANDLE h[NTHREADS];
                   for (int i = 0; i < NTHREADS; i++)
                   {
                          h[i] = CreateThread(NULL, 0, processArray,
                                  data + i*N, 0, NULL);
                   }
                   WaitForMultipleObjects(NTHREADS, h, TRUE, INFINITE);

                  Тут  створюється  4  потоки,  кожен  з  яких  буде  обробляти
            четвертину  масиву               data.  Після  цього  основний  потік
            переводиться в стан очікування функцією WaitForMultipleObjects,

            яка поверне управління тільки після того, як всі потоки завершать
            виконання.


                  Код функції потоку:

                  DWORD WINAPI processArray(LPVOID lpParameter)
                   {
                          double* x = (double*)lpParameter;
                          for (int i = 0; i < N; i++)
                          {
                                  someFunc(x[i]);
                          }
                          return 0;
                   }


                  Якщо  в  системі  встановлено  багатоядерний  процесор,
            наприклад  двоядерний  процесор  Core  i3/i5/i7,  така  обробка
            масиву  буде  виконуватись  приблизно  в  4  рази  швидше,  ніж

            однопоточна           обробка         одним        циклом        (процесори          Core
            підтримують технологію Hyperthreading, що дозволяє одночасне
            виконання  двох  потоків  на  одному  фізичному  ядрі,  тому

            двоядерний  процесор  має  4  логічних  ядра).  Для  визначення


                                                           70
   65   66   67   68   69   70   71   72   73   74   75