Стандарт С++ 11 формально определяет операции получения, выпуска и потребления?
В стандарте С++ 11 упоминается раздел 1.10/5, но формально не определяет термины acquire operation
, release operation
и consume operation
. Затем в Разделе 29 далее используются эти термины для описания действий определенных порядков памяти, атомных операций и ограждений памяти. Например, 29.3/1 "Порядок и согласованность" гласит:
memory_order_release, memory_order_acq_rel и memory_order_seq_cst: операция хранилища выполняет операцию освобождения [выделение добавлено] в поврежденную ячейку памяти.
Этот тип языка повторяется во всем разделе 29, но мне немного мешает, что все значения для перечислений memory_order
основаны на типах операций, которые сами по себе не формализуются стандартом, но должны иметь некоторые общие согласованное значение для их эффективности в качестве определений.
Положите другой способ, если я сказал: "Бар - перевернутый foo", конкретный смысл bar и foo неоднозначен, поскольку ни один из них формально не определен. Определены только их относительная природа.
Знает ли стандарт С++ 11 или какой-либо другой документ комитета стандартов С++ 11 формально определить, что такое acquire operation
, release operation
и т.д., или это просто понятные термины? Если последнее, есть ли хорошая рекомендация, которая считается отраслевым стандартом для значения этих операций? Я специально спрашиваю, потому что модели согласованности аппаратной памяти не созданы равными, и поэтому я полагаю, что должна быть какая-то общепринятая ссылка, которая позволяет тем, кто внедряет компиляторы и т.д. Правильно переводить семантику этих операций в собственные команды сборки.
Ответы
Ответ 1
В одном из примечаний содержится неофициальное обобщенное определение:
выполняющий операцию освобождения в A
, заставляет предыдущие побочные эффекты в других ячейках памяти становиться видимыми для других потоков, которые позже выполняют операцию потребления или получения на A
.
Кроме того, поведение операций получения и освобождения полностью определено в 1.10, в частности, в том, как они способствуют возникновению-до отношений. Любое определение, отличное от поведения, бесполезно.
Ответ 2
Я не вижу никакого формального определения семантики получения/выпуска после быстрого просмотра стандарта, поэтому я предполагаю, что они считаются общепринятыми терминами.
Они не могут все определить.
Это не окончательная ссылка, но Раймонд Чен написал блог о семантике приобретения/выпуска. Его сообщение включает ссылку на определение Microsoft семантики получения и выпуска, которая также может оказаться полезной.
Ответ 3
фактически эти операции определены в разделе 1.10/5-12.
release/acquire
пара соответствует событию до отношения; в то время как пара release/consume
соответствует зависимому от отношения отношениям.
Ответ 4
Я также принимаю семантику приобретения/выпуска, чтобы быть достаточно окончательной на ее основе; хотя они скорее зависят от аппаратного обеспечения, а не от терминов программирования.
Но, я думаю, что параграфы 5 и 6 раздела 1.10, похоже, соответствуют всем определениям семантики получения/выпуска, которые я читал в других языковых стандартах, а также определениях ЦП.
Независимо от того, одна из основных точек С++ 11 заключалась в определении современной модели памяти для поддержки параллельного и многопоточного кода. Мне трудно поверить, что они не поняли это правильно:)