Подтвердить что ты не робот

Стандарт С++ 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 и т.д., или это просто понятные термины? Если последнее, есть ли хорошая рекомендация, которая считается отраслевым стандартом для значения этих операций? Я специально спрашиваю, потому что модели согласованности аппаратной памяти не созданы равными, и поэтому я полагаю, что должна быть какая-то общепринятая ссылка, которая позволяет тем, кто внедряет компиляторы и т.д. Правильно переводить семантику этих операций в собственные команды сборки.

4b9b3361

Ответ 1

В одном из примечаний содержится неофициальное обобщенное определение:

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

Кроме того, поведение операций получения и освобождения полностью определено в 1.10, в частности, в том, как они способствуют возникновению-до отношений. Любое определение, отличное от поведения, бесполезно.

Ответ 2

Я не вижу никакого формального определения семантики получения/выпуска после быстрого просмотра стандарта, поэтому я предполагаю, что они считаются общепринятыми терминами.

Они не могут все определить.

Это не окончательная ссылка, но Раймонд Чен написал блог о семантике приобретения/выпуска. Его сообщение включает ссылку на определение Microsoft семантики получения и выпуска, которая также может оказаться полезной.

Ответ 3

фактически эти операции определены в разделе 1.10/5-12.

release/acquire пара соответствует событию до отношения; в то время как пара release/consume соответствует зависимому от отношения отношениям.

Ответ 4

Я также принимаю семантику приобретения/выпуска, чтобы быть достаточно окончательной на ее основе; хотя они скорее зависят от аппаратного обеспечения, а не от терминов программирования.

Но, я думаю, что параграфы 5 и 6 раздела 1.10, похоже, соответствуют всем определениям семантики получения/выпуска, которые я читал в других языковых стандартах, а также определениях ЦП.

Независимо от того, одна из основных точек С++ 11 заключалась в определении современной модели памяти для поддержки параллельного и многопоточного кода. Мне трудно поверить, что они не поняли это правильно:)