Следующий отрывок из текущего проекта показывает, что я имею в виду:
namespace std {
typedef struct atomic_bool {
bool is_lock_free() const volatile;
bool is_lock_free() const;
void store(bool, memory_order = memory_order_seq_cst) volatile;
void store(bool, memory_order = memory_order_seq_cst);
bool load(memory_order = memory_order_seq_cst) const volatile;
bool load(memory_order = memory_order_seq_cst) const;
operator bool() const volatile;
operator bool() const;
bool exchange(bool, memory_order = memory_order_seq_cst) volatile;
bool exchange(bool, memory_order = memory_order_seq_cst);
bool compare_exchange_weak(bool&, bool, memory_order, memory_order) volatile;
bool compare_exchange_weak(bool&, bool, memory_order, memory_order);
bool compare_exchange_strong(bool&, bool, memory_order, memory_order) volatile;
bool compare_exchange_strong(bool&, bool, memory_order, memory_order);
bool compare_exchange_weak(bool&, bool, memory_order = memory_order_seq_cst) volatile;
bool compare_exchange_weak(bool&, bool, memory_order = memory_order_seq_cst);
bool compare_exchange_strong(bool&, bool, memory_order = memory_order_seq_cst) volatile;
bool compare_exchange_strong(bool&, bool, memory_order = memory_order_seq_cst);
atomic_bool() = default;
constexpr atomic_bool(bool);
atomic_bool(const atomic_bool&) = delete;
atomic_bool& operator=(const atomic_bool&) = delete;
atomic_bool& operator=(const atomic_bool&) volatile = delete;
bool operator=(bool) volatile;
} atomic_bool;
}
Летучий является транзитивным. Таким образом, вы не можете вызывать энергонезависимую функцию-член из изменчивого объекта. С другой стороны, вызов изменяемой функции-члена из энергонезависимого объекта разрешен.
Итак, есть ли разница в реализации между volatile и энергонезависимыми функциями-членами в атомарных классах? Другими словами, есть ли необходимость в энергонезависимой перегрузке?
volatile
перегрузки. - person GManNickG   schedule 02.02.2011volatile atomic<>
? Я думаю, что упускаю что-то важное. - person GManNickG   schedule 02.02.2011atomic<>
в качестве члена другой структуры, и создается экземплярvolatile
? Тогда все его члены тоже будут неявноvolatile
, и без перегрузокvolatile
ваш новый блестящий классatomic
будет бесполезен. :) - person jalf   schedule 02.02.2011std::string
тоже должен иметь все свои функции-членыvolatile
, не так ли? - person GManNickG   schedule 02.02.2011string
не предназначен для использования в изменчивом режиме (он не является потокобезопасным, поэтому он не сможет обработать, если базовая память будет внезапно изменена драйвером или чем-то подобным). Но это была бы довольно плохая атомарная переменная, если бы ее нельзя было рассматривать как изменчивую. ;) Помните, что цельvolatile
состоит в том, чтобы указать, что объект может быть изменен без ведома программы. Это не имеет смысла для строки, но это то, что объект, предназначенный как атомарный, должен иметь возможность обрабатывать. - person jalf   schedule 02.02.2011volatile
. Маркировкаvolatile
не имеет семантической разницы, в отличие от других переменныхvolatile
. - person GManNickG   schedule 03.02.2011volatile
, не так ли? Не могли бы вы также возразить, что нет смысла отмечать членов классаconst
, если класс в любом случае семантически постоянен? Это не имеет никакого значения, кроме того, что позволяет классу продолжать работать в контексте, где присутствует соответствующий квалификатор - person jalf   schedule 03.02.2011const
отлично подходит для демонстрации того, почему нам нужноconst
в функции-члене, но что, если бы у нас был тип, который по своей сути был бы константным? (Как, скажем,std::integral_constant
.) Что хорошего в создании экземпляра этогоconst
? - person GManNickG   schedule 04.02.2011volatile
объектом. Поэтому он принимает параметр типаvolatile T
. Теперь вы, очевидно, хотите иметь возможность передатьatomic<int>
этой функции, потому что предполагается, что она работает с объектами, которые являются изменчивыми. И, черт возьми, ваш код не скомпилируется, потому что ваш семантически изменчивый объект больше не может использоваться, когда к нему добавляется квалификаторvolatile
. Это было бы абсурдно, точно так же, как гипотетическийstd::integral_constant
должен иметь возможность передаваться функции, которая ожидаетconst T
без нарушения. - person jalf   schedule 05.02.2011volatile atomic<>
. - person GManNickG   schedule 09.02.2011