Trong tài liệu của std::memory_order
trên cppreference.com có một ví dụ về việc đặt hàng thoải mái:
Đặt hàng thoải mái
Các hoạt động nguyên tử được gắn thẻ
memory_order_relaxed
không phải là hoạt động đồng bộ hóa; họ không áp đặt một trật tự trong số các truy cập bộ nhớ đồng thời. Họ chỉ đảm bảo tính nguyên tử và tính nhất quán để sửa đổi.Ví dụ: với x và y ban đầu bằng 0,
// Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D
được phép tạo r1 == r2 == 42 bởi vì, mặc dù A được giải trình tự trước B trong luồng 1 và C được giải trình tự trước D trong luồng 2, không có gì ngăn D xuất hiện trước A theo thứ tự sửa đổi của y và B từ xuất hiện trước C theo thứ tự sửa đổi của x. Hiệu ứng phụ của D trên y có thể hiển thị với tải A trong luồng 1 trong khi hiệu ứng phụ của B trên x có thể hiển thị với tải C trong luồng 2. Đặc biệt, điều này có thể xảy ra nếu D hoàn thành trước C trong luồng 2, do sắp xếp lại trình biên dịch hoặc trong thời gian chạy.
nó nói "C được giải trình tự trước D trong luồng 2".
Theo định nghĩa của trình tự trước, có thể tìm thấy trong Thứ tự đánh giá , nếu A được giải trình tự trước B, thì việc đánh giá A sẽ được hoàn thành trước khi bắt đầu đánh giá B. Vì C được giải trình tự trước D trong luồng 2, C phải được hoàn thành trước khi D bắt đầu, do đó phần điều kiện của câu cuối cùng của ảnh chụp sẽ không bao giờ được thỏa mãn.