Поделиться через


2.6.5 Директива flush

flush директива, указывающее, точно ли или содержится в последовательности "между потоками" на котором требуется предоставляет реализацию, что все потоки в рабочей группе имеют согласованное представление некоторых объектов, указанных ниже) в памяти. Это означает, что предыдущие оценки выражений, ссылающихся на эти объекты, в свою очередь, полные и последующие оценки еще не начинали. Например, компиляторы должны получить значения объектов из регистров в памяти, и оборудование записать на диск буферов может записи в памяти и перезапустить значения объектов из памяти.

Синтаксис flush директива выглядит следующим образом:

#pragma omp flush [(variable-list)]  new-line

Если объекты, требующие синхронизации могут быть обозначены переменными, то эти переменные могут быть указаны в необязательном список переменных. Если указатель присутствует в список переменныхуказатель, не очищается, сам указатель ссылается на объект.

A flush без а директива список переменных синхронизировать все общие объекты, за исключением труднопоступных объектов с автоматическим длительностью хранения. (Это, вероятно, чтобы иметь несколько служебных данных, чем a flush с список переменных.) A flush без а директива список переменных подразумевает для следующих рекомендаций:

  • barrier

  • Записи и выйти из Критические

  • Записи и выйти из ordered

  • Записи и выйти из Параллельно

  • На выйти из для

  • На выйти из Разделы

  • На выйти из Одинарный

  • Записи и выйти из параллель для

  • Записи и выйти из параллельные разделах

Если а не подразумевается директива nowait предложение отсутствует. Следует отметить, что он flush директива не подразумевается для любого поиска:

  • Для записи для

  • Для записи или выйти из Образец

  • Для записи Разделы

  • Для записи Одинарный

Ссылка, которая обращается к значению объекта с типом испаряющ-квалифицированным ведет себя так, как если бы было a flush директива указание, что объект на предыдущем шаге последовательности. Ссылка, которая изменяет значение объекта с типом испаряющ-квалифицированным ведет себя так, как если бы было a flush директива указание, что последующий этап последовательности на объект.

Обратите внимание, что поскольку flush директива не имеет выписку языка c, как часть своего синтаксиса, существуют некоторые ограничения на его месте в рамках программы. См. Приложение C# для формального грамматики. В приведенном ниже примере показаны эти ограничения.

/* ERROR - The flush directive cannot be the immediate
*          substatement of an if statement.
*/
if (x!=0)
   #pragma omp flush (x)
...

/* OK - The flush directive is enclosed in a
*      compound statement
*/
if (x!=0) {
   #pragma omp flush (x)
}

Ограничения flush директива выглядит следующим образом:

  • Переменная, определенная в a flush директива не должна иметь ссылочный тип.