2016-03-28 25 views
5
void HelloWorld() 
{ 
    static std::atomic<short> static_counter = 0; 
    short val = ++static_counter; // or val = static_counter++; 
} 

Nếu chức năng này được gọi là từ hai chủ đề,Chủ đề an toàn biến địa phương

thể biến địa phương val được 1 trong cả hai bài? hoặc (0 nếu static_counter++ được sử dụng?)

+1

Có thể trùng lặp http://stackoverflow.com/questions/8102125/is-local-static-variable-initialization-thread-safe-in-c11 – user2807083

+0

@ user2807083 Đó không phải là câu hỏi. Tôi biết static_counter sẽ được khởi tạo một cách an toàn. Tiêu chuẩn C++ 11 yêu cầu điều đó. Tôi đang nói về val, mà không phải là tĩnh .. – James

+1

Tôi nghĩ rằng đây là không có gì về địa phương của bạn 'var', nhưng tất cả về nhà điều hành ++ áp dụng cho biến tĩnh. Vì vậy, tôi nghĩ câu hỏi đúng là "Sự gia tăng của chuỗi biến nguyên tử có an toàn không?" – user2807083

Trả lời

2

Biến địa phương có thể là 1 trong cả hai luồng không?

số ++static_counter tương đương với:

fetch_add(1)+1 

mà không thể trở về cùng một giá trị cho hai (hoặc nhiều hơn) Hiện chủ đề fetch_add được thực hiện nguyên tử.

+0

Điều tương tự có áp dụng cho static_counter ++ không? – James

+0

Có. Điều đó tương đương với 'fetch_add (1)'. Vui lòng đọc [doc] (http://en.cppreference.com/w/cpp/atomic/atomic/operator_arith) để biết thêm chi tiết. – Nawaz

+0

Có hai điều liên quan, việc xây dựng đối tượng 'static_counter' và hoạt động gia tăng. Sau này được đảm bảo là nguyên tử, nhưng theo các liên kết trong các ý kiến, xây dựng không phải là. –

2

No. Cách duy nhất val có thể có cùng giá trị trong cả hai chủ đề là nếu hai hoạt động nguyên tử chồng lên nhau. Theo định nghĩa, hoạt động nguyên tử không thể trùng lặp.

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