Согласно модели памяти OpenMP следующее неверно:
int *p0 = NULL, *p1 = NULL;
#pragma omp parallel shared(p0,p1)
{
int x;
// THREAD 0 // THREAD 1
p0 = &x; p1 = &x;
*p1 ... *p0 ...
}
Мой пример выглядит следующим образом:
int *p0 = NULL, *p1 = NULL;
#pragma omp parallel shared(p0,p1)
{
int x;
// THREAD 0 // THREAD 1
p0 = &x; p1 = &x;
#pragma omp flush
#pragma omp barrier
*p1 ... *p0 ...
#pragma omp barrier
}
Было бы это неправильно? Я не могу найти что-то в модели памяти, что бы это запретило.
Я полагаю, что мой игрушечный пример верен, поскольку в модели памяти в 3.1 они позволяют задаче иметь доступ к частной переменной, пока программист гарантирует, что она все еще жива. Учитывая тот факт, что задачи могут быть отвязаны, теоретически они могут выполняться в другом рабочем потоке, что позволяет одному потоку OpenMP получить доступ к частной памяти другого.