Назначение атомных структур - PullRequest
0 голосов
/ 12 июня 2018

В соответствии с C11 § 6.5.2.3

Accessing a member of an atomic structure or union object results
in undefined behavior.

Это имеет смысл, поскольку вы не можете получить доступ ко всей структуре в целом.Тем не менее, почему _Atomic тогда также является классификатором типа, а не только спецификатором типа?

Другими словами, какова цель структуры, которая квалифицируется как _Atomic?Мне не разрешено ни читать, ни записывать какие-либо его элементы.

#include <stdatomic.h>

struct {
    int x;
} _Atomic foo;

int main(void) {
    foo.x = 42;     // write error
    return foo.x;   // read error
}

Оба обращения foo.x приводят к предупреждению / ошибке в GCC / Clang - что совершенно нормально по отношению кСтандарт С11.Зачем мне тогда квалифицировать структуру как _Atomic?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Вы не можете получить доступ к отдельным членам, но всегда структура в целом.Я думаю, что доступ к частям чего-то, что должно быть атомной единицей, не имеет особого смысла.

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

По умолчанию все такие операции на целом атомарном struct имеют последовательную согласованность.

0 голосов
/ 12 июня 2018

Некоторые реализации могут быть в состоянии гарантировать атомарное поведение для структур, отвечающих определенным критериям.Я не знаю, существовали ли какие-либо реализации, которые делали это на самом деле до публикации Стандарта C11, но это, безусловно, казалось бы правдоподобным.Если бы реализация эффективно поддерживала такие структуры, для стандарта было бы довольно досадно требовать, чтобы они рассматривались как нарушение ограничения.

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

...