2012-09-09 34 views
17

Các cửa hàng là các hoạt động phát hành và tải là các hoạt động có được cho cả hai. Tôi biết rằng memory_order_seq_cst có nghĩa là để áp đặt một tổng số đặt hàng bổ sung cho tất cả các hoạt động, nhưng tôi không xây dựng một ví dụ mà nó không phải là trường hợp nếu tất cả các memory_order_seq_cst được thay thế bằng memory_order_acq_rel.Bộ nhớ memory_order_seq_cst và memory_order_acq_rel khác nhau như thế nào?

Tôi có bỏ sót điều gì đó, hoặc sự khác biệt chỉ là hiệu ứng tài liệu, tức là người dùng nên sử dụng memory_order_seq_cst nếu có ý định không chơi với mô hình thoải mái hơn và sử dụng memory_order_acq_rel khi hạn chế mô hình thoải mái?

Trả lời

18

http://en.cppreference.com/w/cpp/atomic/memory_order có ví dụ điển hình ở dưới cùng chỉ hoạt động với memory_order_seq_cst. Về cơ bản, memory_order_acq_rel cung cấp các lệnh đọc và viết liên quan đến biến nguyên tử, trong khi memory_order_seq_cst cung cấp thứ tự đọc và viết trên toàn cầu. Đó là, các hoạt động liên tục tuần tự được hiển thị theo cùng thứ tự trên tất cả các luồng.

Ví dụ nắm này:

bool x= false; 
bool y= false; 
int z= 0; 

a() { x= true; } 
b() { y= true; } 
c() { while (!x); if (y) z++; } 
d() { while (!y); if (x) z++; } 

// kick off a, b, c, d, join all threads 
assert(z!=0); 

Các thao tác trên z được bảo vệ bởi hai biến nguyên tử, không phải là một, vì vậy bạn không thể sử dụng ngữ nghĩa Acquire phát hành để thực thi mà z luôn tăng lên.

+0

Tôi không hiểu tại sao 'x = true; y = true; c(); d()' là không thể? Điều đó sẽ gây ra nó là 0. Ngoài ra tôi không biết tại sao tôi nhận được 2 rất nhiều như là kết quả. –

+1

@ acidzombie24, ngay cả trong trường hợp đó, 'z' sẽ là 2. – MSN

+0

Tôi đã sai lầm, tôi đã đọc sai mã. Điều đó có ý nghĩa hoàn hảo ngay bây giờ –

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