Ответ на ваш вопрос - да, потоки имеют доступ к глобальным и статическим данным в одном модуле компиляции, но есть еще кое-что в этой теме об «обмене данными между потоками», которую важно понять.
Для каждого потока существует соответствующая функция («функция потока»), которую поток будет выполнять параллельно с другими потоками. Поток имеет доступ ко всему, к чему эта функция имеет доступ, через указатель или опорные параметры, глобальные данные, статические данные в том же модуле компиляции, что и функция потока, или глобальные и / или статические данные, которые доступны для чтения / изменения через другие функции, функция потока может вызвать. Вы должны быть в состоянии определить каждую область памяти, которую данная функция может прочитать или изменить. Эти области памяти данной функции потока являются точно областями памяти, к которым у потока есть доступ.
Легко видеть, что глобальные данные и статические данные в одном модуле компиляции доступны для функции потока, поэтому ответ на ваш вопрос "да".
Одна вещь, на которую вы можете обратить внимание, - это OpenMP, который имеет встроенные конструкции для распараллеливания операции countOccurrences
(так называемое «сокращение»):
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
size_t countOccurrences(const int *arr, size_t n, int which) {
size_t count, i;
count = 0;
#pragma omp parallel for reduction(+:count)
for (i = 0; i < n; ++i) {
if (arr[i] == which)
++count;
}
return count;
}
int main()
{
int arr[] = { 3, 5, -1, -1, 0 };
size_t count = countOccurrences(arr, sizeof (arr)/sizeof (arr[0]), -1);
printf("count = %d\n", (int) count);
return EXIT_SUCCESS;
}