Есть threadprivate
: http://msdn.microsoft.com/en-us/library/2z1788dd
static int buffer[BUFSIZE];
#pragma omp threadprivate(buffer)
Эта прагма работает с глобальной / статической переменной, поэтому вам не нужно беспокоиться о переполнении стека. (В таком случае переполнения стека вообще неплохо бы увеличить размер стека путем настройки опции компоновщика.)
Обратите внимание, что компиляторы могут иметь разные детали реализации для threadprivate
. Например, компилятор VS 2010 не может сделать makepriprivate, если переменная имеет конструктор. Однако компилятор Intel C / C ++ отлично справляется с этой задачей.
Использование отдельных omp parallel
и omp for
также является хорошей идеей, как показала Сехе. Однако использование threadprivate
позволяет использовать omp parallel for
напрямую.
К вашему сведению: даже если вам нужно выделить свое собственное локальное хранилище потоков, во многих случаях вам на самом деле не нужно вызывать вызов функции для конкретной ОС, такой как TlsAlloc
. Вы можете просто выделить массив из N структур данных. И затем получите к ним доступ, используя omp_get_thread_num
, который дает идентификатор потока от 0 до N-1. Конечно, вы должны учитывать ложное совместное использование, вставляя отступы, чтобы гарантировать, что каждая структура данных должна быть выровнена по разной строке кэша (в основном современные кэши ЦП имеют строку кэша по 64 байта).