Определение понятия "атомный объект"
В стандартном жаргоне 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 нет атомарных операций без атомарных объектов. Это добровольно исправлено так, что атомарность доступа к этим объектам никогда не может быть нарушена.