2010-05-26 39 views
5

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.

+0

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

+0

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ồ. –

+0

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

Trả lời

4

Nếu chúng ta mất nhiều thời gian (hoặc, trình tự hướng dẫn nếu bạn thích) chảy xuống, giống như đọc mã, sau đó sự hiểu biết của tôi là

  • Một Acquire hàng rào cho phép bộ nhớ khác truy cập để di chuyển xuống qua hàng rào , nhưng không lên vượt qua hàng rào
  • Một hàng rào phát hành cho phép bộ nhớ khác truy cập để di chuyển lên qua hàng rào, nhưng không xuống vượt qua hàng rào

Nói cách khác, nếu bạn có mã như

acquire 
// other stuff 
release 

khi đó truy cập bộ nhớ có thể di chuyển từ bên ngoài cặp mua/giải phóng vào bên trong, chứ không phải theo cách khác (và họ cũng không thể bỏ qua cặp mua/giải phóng hoàn toàn).

Với ngữ nghĩa nhất quán thoải mái trong ví dụ đầu tiên trong câu hỏi, phần cứng có thể sắp xếp lại quyền truy cập bộ nhớ sao cho các cửa hàng nhập hệ thống bộ nhớ trước khi tải, do đó cho phép r1 = r2 = 1. Với ngữ nghĩa thu được/giải phóng trong ví dụ thứ hai, việc sắp xếp lại được ngăn chặn, và do đó r1 = r2 = 1 là không thể.

+0

Tôi không chắc tôi hiểu câu trả lời của bạn. –

+0

Hmm, tôi có giúp tôi làm rõ không? Nếu không, bạn không hiểu cụ thể điều gì? – janneb

+0

Lấy ví dụ thứ hai của tôi, thay thế bản phát hành bằng cách thư giãn, mua lại vẫn thu được. R1 = r2 = 1 có thể không? Bây giờ khởi động lại từ phiên bản ban đầu của ví dụ thứ hai một lần nữa, nhưng lần này thay thế mua lại bằng cách thư giãn và giữ bản phát hành như hiện nay. R1 = r2 = 1 có thể không? –