Poniższy fragment z obecnego projektu pokazuje, co to znaczy:C++ 0x | Dlaczego std :: atomic przeciąża każdą metodę za pomocą volatile-qualifier?
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;
}
Lotny jest przechodnia. W związku z tym nie można wywołać nielotnej funkcji składowej z obiektu zmiennego. Z drugiej strony dozwolone jest wywoływanie funkcji zmiennej z obiektu nieulotnego.
Czy istnieje zatem różnica w implementacji między lotnymi i nielotnymi funkcjami członków w klasach atomowych? Innymi słowy, czy istnieje potrzeba trwałego przeciążenia?
Lepsze pytanie brzmi: dlaczego w pierwszej kolejności muszą występować przeciążenia 'volatile'. – GManNickG
@GMan: ponieważ w przeciwnym razie funkcje nie mogły zostać wywołane na lotnych danych. ;) – jalf
@jalf: Ha, tak, ale skoro operacje, które sam tworzy, są atomowe (a więc i obserwowalne), dlaczego mielibyśmy stworzyć 'lotny atomowy <>? Chyba brakuje mi czegoś poważnego. – GManNickG