2014-12-02 23 views
5

Giả sử tôi có lớp sau:Tiếp cận chưa được khởi tạo biến tư nhân nguyên tử trong C++

class A 
{ 
public: 
... 
... 
void incrementN() {++n_;} 
uint64_t getN() {return n_;} 

private: 
std::atomic<uint64_t> n_; 
... 
... 

}; 

Giả sử rằng tôi khởi tạo tất cả các biến khác trong lớp, trừ n_ và rằng đây không phải là thread lưu trữ địa phương, do đó, không khởi tạo bằng không.

Tôi tạo đối tượng của lớp A và tiếp tục gọi số incrementN().

Nếu tại một thời điểm nào đó tôi muốn giá trị n_ và tôi gọi getN(), điều này có thể gây ra quy trình load() cho nguyên tử n_ bị lỗi không?

+0

Bạn có một 'constructor mặc định A', hoặc bất kỳ' A' constructor ở tất cả? Nếu bạn không có bất kỳ constructors nào, hoặc một constructor mặc định ('A() = default;') thì trình biên dịch tạo ra constructor mặc định sẽ gọi hàm khởi tạo mặc định của tất cả các thành viên không tĩnh ([reference] (http: // vi .cppreference.com/w/cpp/language/default_constructor)) và ['std :: constructor mặc định nguyên tử] (http://en.cppreference.com/w/cpp/atomic/atomic/atomic) sẽ là gọi là. –

+0

Có, tôi có một hàm tạo cho A, và nó khởi tạo các biến khác của A nhưng không khởi tạo 'n_' – user1715122

+0

@JoachimPileborg n_ là khởi tạo mặc định, đối tượng được xây dựng, giá trị của nó không được chỉ định, vì vậy nó không phải UB. – Rost

Trả lời

0

Tải trọng sử dụng memory_order_seq_cst theo mặc định. Xem tại đây: http://en.cppreference.com/w/cpp/atomic/memory_order.

Như đã đề cập trong nhận xét, nó sẽ không cung cấp cho bạn bất kỳ vấn đề nào mà int bình thường sẽ không cung cấp. Bạn có lo ngại về tràn nếu giá trị ban đầu chưa được khởi tạo lớn không? Xem ở đây để biết các hậu quả có thể xảy ra: https://www.owasp.org/index.php/Integer_overflow

0

Biến thành viên n_ chỉ chưa được khởi tạo. Việc truy cập của trường sẽ gây ra một đọc trong bộ nhớ và không có lý do để sụp đổ, mặc dù bố trí của 8 byte bộ nhớ không được biết đến.

Thực tế là các thành viên là nguyên tử không có tầm quan trọng ở đây. Nó sẽ làm cho trình biên dịch không sử dụng bất kỳ tối ưu hóa nào trên biến cụ thể này và cũng có thể gây ra việc xóa bỏ dòng bộ nhớ cache cho RAM trên mỗi lần ghi.

Các vấn đề liên quan