현재 초안에서 발췌 한 내용은 다음과 같습니다.C++ 0x | 왜 std :: atomic가 휘발성 한정자로 각 메소드를 오버로드합니까?
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 및 non-volatile 멤버 함수 사이에 구현 차이가 있습니까? 즉, 비 휘발성 과부하가 필요합니까?
더 좋은 질문은 처음에는 '휘발성'오버로드가 필요한 이유입니다. – GManNickG
@GMan : 그렇지 않으면 함수가 휘발성 데이터에서 호출 될 수 없기 때문입니다. ;) – jalf
@ jalf : 하, 그렇습니다.하지만 타입 자체가 만드는 연산은 원자 적이며 따라서 관찰 할 수있는 것이기 때문에 왜 우리는 휘발성 원자 >를 만들까요? 나는 메이저 무언가를 놓치고 있다고 생각한다. – GManNickG