Определение понятия "атомный объект"

В стандартном жаргоне C и C++ фраза " атомный объект " означает "объект атомного типа", не так ли?

Ни один стандарт не будет явно определять каждую фразу из двух слов, поэтому он не ошибается в стандартах C и C++ за то, что опущено явное определение этой фразы. Тем не менее, когда я читаю в C++ 17 стандарте (проект здесь), раздел. 4.7.1 (4), что "все модификации конкретного атомарного объекта M происходят в каком-то определенном общем порядке, называемом порядком модификации M" - и когда стандарт многократно использует аналогичный язык для разграничения еще более точной логики для параллелизма - я хотел бы быть уверен, что я не случайно недоразумение.

Правильно ли я предполагаю, что фраза "атомный объект" означает

  • объект атомарного типа?

Единственная правдоподобная альтернатива, которую я могу себе представить, заключается в том, что вместо этого

  • правильно выровненный объект достаточно мал, чтобы аппаратное обеспечение могло обрабатывать его атомарно.

Что это, пожалуйста?

(Примечание: я помечаю этот вопрос как C, так и C++, потому что, когда речь идет об атомарности, оба стандарта используют почти идентичный язык. По этой причине специалист по любому из языков может ответить, насколько мне известно. Если по какой-то причине Я ошибаюсь, тогда, пожалуйста, удалите тег C и сохраните C++.)

Ссылка: см. Также этот вопрос, для которого мой вопрос является предварительным.

Ответы

Ответ 1

Стандарт C++ устанавливает набор правил для операций и их последствий для атомарных объектов ([intro.races]). Если все операции над объектом удовлетворяют этим правилам, то этот объект является атомарным.

фраза "атомный объект" означает "объект атомного типа", не так ли?

Это не сформулировано так в стандарте. Но поскольку эффект от операций определяется типом объекта, это не является необоснованным выводом. Также соответственно: Атомный тип - это тип, экземплярами которого являются атомарные объекты.

Стандартная библиотека C++ предоставляет набор типов, которые гарантированно являются атомарными, а также функции для тех типов, которые гарантированно являются атомарными операциями ([Atomics]).

правильно выровненный объект достаточно мал, чтобы аппаратное обеспечение могло обрабатывать его атомарно.

Стандарт C++ не указывает ничего о выравнивании или размере атомных объектов.

Если объект/тип гарантированно является атомарным (см. [Atomics]), и если оборудование предъявляет такие требования к атомарности, то либо реализация языка должна гарантировать выполнение этих требований, либо реализация должна использовать блокировки для принудительного применения атомарность.

Ответ 2

На мой взгляд, атомарность, строго говоря, не относится к типам или объектам, она применяется к операциям, то есть вы можете сказать, что операция является атомарной или нет.

Под "атомарным объектом" мы понимаем объект, открытый интерфейс которого предоставляет только атомарные операции, т.е. все операции, которые вы можете выполнять с этим объектом, являются атомарными.

В C и C++ может быть так, что понятия определяются наоборот: сначала определяют атомарные объекты, а затем определяют атомарные операции в терминах атомных объектов. Вероятно, для C и C++ имело смысл определить его таким образом, потому что формулировка стандарта в первую очередь касается определения языка. Однако с точки зрения теоретической и абстрактной функциональности основной задачей являются атомные операции.

C++ имеет стандартный шаблон класса std::atomic<T> который соответствует приведенным выше описаниям.

Ответ 3

Я могу ответить за C, но C++ действительно предназначен для синхронизации с C в этих точках.

Да, когда стандарт C говорит об "атомарном объекте", это означает, что объект с эффективным типом является атомарно квалифицированным. Но также кажется, что это не записано явно, так что, вероятно, было бы неплохо добавить это. Я позабочусь об этом.

Кроме того, как утверждали некоторые люди, в C нет атомарных операций без атомарных объектов. Это добровольно исправлено так, что атомарность доступа к этим объектам никогда не может быть нарушена.