hiện nay C++0x draft bang trên phần 29.3.9 và 29.3.10, trang 1111-1112 mà trong ví dụ sau:C++ 0x: bộ nhớ đặt hàng
// Thread 1
r1 = y.load(memory_order_relaxed);
x.store(1, memory_order_relaxed);
// Thread 2
r2 = x.load(memory_order_relaxed);
y.store(1, memory_order_relaxed);
Kết quả r1 = r2 = 1
có thể kể từ khi hoạt động của mỗi thread được thoải mái và địa chỉ không liên quan. Bây giờ câu hỏi của tôi là về các kết quả có thể có của ví dụ sau (tương tự):
// Thread 1
r1 = y.load(memory_order_acquire);
x.store(1, memory_order_release);
// Thread 2
r2 = x.load(memory_order_acquire);
y.store(1, memory_order_release);
Tôi nghĩ rằng trong trường hợp này kết quả là r1 = r2 = 1
là không thể. Nếu có thể, tải trọng của y sẽ đồng bộ hóa với (do đó xảy ra trước đó) các cửa hàng để y. Tương tự như x, tải của x sẽ xảy ra trước khi cửa hàng x. Tuy nhiên, tải của y được sắp xếp theo trình tự trước đó (do đó cũng xảy ra trước đó) các cửa hàng để x. Điều này tạo ra một mối quan hệ xảy ra trước đó theo chu kỳ mà tôi nghĩ là không được phép.
Tôi đã thay đổi tiêu đề, vì vấn đề này không liên quan gì đến các cửa hàng đầu cơ. Đối với các cửa hàng đầu cơ, xem http://stackoverflow.com/questions/2001913/c0x-memory-model-and-speculative-loads-stores – janneb
Lưu trữ đầu vào là từ khóa ở đây vì kết quả «r1 = r2 = 1' yêu cầu các cửa hàng để được sắp xếp lại ("suy đoán") trước cả hai lần đọc. Tiêu đề của bạn quá mơ hồ. –
Lưu trữ đầu cơ trong ngữ cảnh của các tài liệu làm việc C++ 0x đề cập đến đầu cơ trình biên dịch, xem câu hỏi tôi đã liên kết trong bình luận trước của tôi. Câu hỏi của bạn phải làm với sắp xếp lại phần cứng (tùy thuộc vào mô hình nhất quán bộ nhớ chia sẻ cấu trúc phần cứng thực hiện), và cách C++ 0x cung cấp các cơ sở để hạn chế thứ tự bộ nhớ này bằng cách ban hành các hướng dẫn về bộ nhớ khác nhau. Vì vậy, tôi cảm thấy rằng tiêu đề tôi cung cấp là phù hợp hơn so với bản gốc; nhưng hey, đó là câu hỏi của bạn vì vậy cảm thấy tự do để thay đổi nó để bất cứ điều gì bạn muốn. – janneb