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