C++ 0x giấy N2427 (Atomics) khẳng định gần như sau. Tôi đã thay đổi từ ngữ hơi quá của nó dễ dàng hơn để đọc cho tình hình sụt cụ thể, các bộ phận tôi đã thay đổi trong đậm:
Effects: nguyên tử thay thế các giá trị trong đối tượng với kết quả của cắt giảm áp dụng cho giá trị trong đối tượng và toán hạng đã cho. Bộ nhớ bị ảnh hưởng theo đơn đặt hàng. Các hoạt động này là các hoạt động đọc-sửa-ghi theo nghĩa của định nghĩa "đồng bộ hóa với" trong [phần mới được thêm bởi N2334 hoặc người kế thừa], và do đó cả hai thao tác và đánh giá đã tạo ra giá trị đầu vào đồng bộ hóa với bất kỳ đánh giá nào đọc giá trị cập nhật.
Returns: nguyên tử, giá trị của đối tượng ngay trước sụt lần.
Hoạt động nguyên tử đảm bảo rằng toán tử giảm sẽ trả về giá trị mà biến được giữ ngay trước thao tác, đây là nguyên tử để không có giá trị trung gian từ các bản cập nhật của một chuỗi khác.
Điều này có nghĩa sau đây là chỉ hành có thể có của mã này với 2 chủ đề:
(Initial Value: 1)
Thread 1: Decrement
Thread 1: Compare, value is 0, enter region of interest
Thread 2: Decrement
Thread 2: Compare, value is -1, don't enter region
hoặc
(Initial Value: 1)
Thread 1: Decrement
Thread 2: Decrement
Thread 1: Compare, value is 0, enter region of interest
Thread 2: Compare, value is -1, don't enter region
Trường hợp 1 là thật nhàm chán mong đợi như vậy.
Trường hợp 2 xen kẽ các hoạt động giảm và thực hiện các phép so sánh sau này. Vì thao tác giảm và tìm nạp là nguyên tử, không thể cho chuỗi 1 nhận giá trị khác 0 để so sánh. Nó không thể nhận được -1 vì hoạt động là nguyên tử ... việc đọc diễn ra tại thời điểm giảm và không phải là tại thời điểm so sánh. Thêm chủ đề sẽ không thay đổi hành vi này.
Tại sao bạn cho rằng điều đó không thể thực hiện được? Nếu đó là thao tác duy nhất bạn thực hiện trên 'myint' thì cuối cùng nó sẽ tràn. – Patrick
@Patrick sẽ là hành vi không xác định. –
Câu hỏi thực sự là nếu std :: atomic :: operator-- trả về nguyên tử giá trị cũ. –
cdleonard