Ответ 1
Наиболее важные отличия, которые вы должны запомнить:
-
A
private
переменная является локальной для региона и большую часть времени будет размещаться в стеке. Время жизни переменной конфиденциальности - это продолжительность, определенная в предложении о разделе данных. Каждый поток (включая главный поток) делает частную копию исходной переменной (новая переменная больше не привязана к хранилищу с исходной переменной). -
A
threadprivate
с другой стороны, скорее всего, будет помещаться в кучу или в локальное хранилище потоков (это можно рассматривать как глобальную память, локальную для потока). Переменная Athreadprivate
сохраняется в разных регионах (в зависимости от некоторых ограничений). Основной поток использует исходную переменную, все остальные потоки составляют частную копию исходной переменной (основная переменная по-прежнему связана с исходной переменной).
-
Есть и более сложные отличия:
-
Переменные, определенные как
private
, являются undefined для каждого потока при вводе конструкции, а соответствующая общая переменная undefined при выходе из параллельной конструкции; начальный статус указателяprivate
не определен. -
Но данные в общих блоках
threadprivate
следует считать undefined при входе в первую параллельную область, если не указано условиеcopyin
. Когда общий блок появляется в директивеthreadprivate
, каждая копия потока инициализируется один раз до его первого использования.
-
-
OpenMP Specifications (раздел 2.14.2) действительно дают очень хорошее описание (а также более подробно)
threadprivate
директива:Каждая копия переменной
threadprivate
инициализируется один раз в порядке, указанном программой, но в неопределенной точке программы перед первой ссылкой на эту копию. Хранение всех копий переменнойthreadprivate
освобождается в соответствии с тем, как статические переменные обрабатываются на базовом языке, но в неопределенной точке программы.Программа, в которой поток ссылается на другую копию потоков переменной
threadprivate
, не соответствует требованиям.Содержимое переменной
threadprivate
может изменяться в точке планирования задачи, если исполняемый поток переключается на другую задачу, которая изменяет переменную. Подробнее о планировании задач см. Раздел 1.3 на стр. 14 и раздел 2.11 на стр. 113.В области
parallel
ссылки основного потока будут связаны с копией переменной в потоке, который встретил областьparallel
.Во время последовательных ссылок на части будет ссылка на исходную цепочку переменных. Значения данных в исходной копии потоков переменной
threadprivate
гарантированно сохраняются между любыми двумя последовательными ссылками на переменную в программе.Значения данных в переменных
threadprivate
не начальных потоков гарантируют сохранение между двумя последовательными активными областямиparallel
только при соблюдении следующих условий:-
Ни одна область
parallel
не вложена в другую явную областьparallel
. -
Количество потоков, используемых для выполнения обеих областей
parallel
, одинаковое. -
Политики слияния потоков, используемые для выполнения обеих областей
parallel
, одинаковы. -
Значение переменной внутреннего ключа dyn-var в области задач приложения является ложным при входе в обе области
parallel
.
Если все эти условия сохраняются, и если в обеих областях указана переменная
threadprivate
, то потоки с тем же номером потока в соответствующих областях будут ссылаться на ту же копию этой переменной. -