2.7.1 Директива threadprivate
threadprivate директива позволяет файл-область с именем, пространством имен-область или статические переменные, определенные в блок-области список переменных private в поток. список переменных список переменных с разделителями-запятыми, которые не имеют неполный тип. Синтаксис threadprivate директива выглядит следующим образом:
#pragma omp threadprivate(variable-list) new-line
Каждая копия a threadprivate переменная инициализирована раз для неопределенного шаг в программе до первой ссылки на эту копии, и в обычном режиме (т е как мастер-копия будет инициализирована в последовательном выполнении программы). Обратите внимание, что, если он имеется ссылка в явном инициализаторе a threadprivate переменная, а значение объекта изменены до первой ссылки на копии переменной, а затем расширения функциональности не определено.
Как и в закрытой переменной поток не должен ссылаться на копию другого потока a threadprivate объект. При выполнении последовательных областей и мастерских областей программы, ссылки будут к копии главного потока объекта.
После первой параллельной области выполняет данных в threadprivate гарантируется сохраняет объекты, только если был заблокирован динамического механизма потоков, и если количество потоков остается неизменным для всех параллельных областей.
Ограничения threadprivate директива выглядит следующим образом:
A threadprivate директива для переменных файл-области или пространство имен-области должна использоваться вне любых определения или объявления и должна предшествовать любому лексически ссылки на переменные в списке.
Каждая переменная список переменных a threadprivate директива в области файла или пространства имен должна ссылаться на переменную объявлению в области файла или пространства имен, которые лексически предшествует директива.
A threadprivate директива для статических переменных блок-области должна отображаться в область действия переменной, а не во вложенной области. Рекомендация должна предшествовать любому лексически ссылки на переменные в списке.
Каждая переменная список переменных a threadprivate директива в области блока должна ссылаться на переменную объявлению в той же области, которые лексически предшествует директива. Объявление переменной должно использовать статический описатель хранени-класса.
Если переменная определена в a threadprivate директива в одной единице измерения перевода, ее необходимо определить в выражении threadprivate директива в каждой единицы измерения перевода, в которой он объявлен.
A threadprivate переменная не должна появляться в любое предложение, отличный от copyin" copyprivate" schedule" num_threadsили If предложение.
Адрес a threadprivate переменная не константы адреса.
A threadprivate переменная должна иметь неполный тип или ссылочный тип.
A threadprivate переменная с типом класса non-СТРУЧКА должна иметь точно, выраженный конструктор копии, если объявлено с явным инициализатором.
В следующем примере показано, как изменить переменную, которая отображается в инициализатор может привести к неспецифицированную расширения функциональности, а также как избежать этой проблемы с помощью вспомогательного объекта и копия-конструктора.
int x = 1;
T a(x);
const T b_aux(x); /* Capture value of x = 1 */
T b(b_aux);
#pragma omp threadprivate(a, b)
void f(int n) {
x++;
#pragma omp parallel for
/* In each thread:
* Object a is constructed from x (with value 1 or 2?)
* Object b is copy-constructed from b_aux
*/
for (int i=0; i<n; i++) {
g(a, b); /* Value of a is unspecified. */
}
}
Перекрестные ссылки:
Динамические потоки, см. в разделе Раздел 3.1.7 на странице 39.
OMP_DYNAMIC переменная среды выполнения, см. в разделе Шаг 4.3 на странице 49.