Vì vậy, tôi đã đọc về mô hình bộ nhớ là một phần của tiêu chuẩn C++ 0x sắp tới. Tuy nhiên, tôi là một chút bối rối về một số hạn chế cho những gì trình biên dịch được phép làm, đặc biệt là về tải trọng đầu cơ và các cửa hàng.Mô hình bộ nhớ C++ 0x và tải/lưu trữ đầu cơ
Để bắt đầu, một số công cụ có liên quan:
Hans Boehm's pages about threads and the memory model in C++0x
Boehm, "Threads Cannot be Implemented as a Library"
Boehm and Adve, "Foundations of the C++ Concurrency Memory Model"
Boehm, "Concurrency memory model compiler consequences", N2338
Bây giờ, ý tưởng cơ bản về bản chất là "Sự nhất quán theo tuần tự cho các chương trình dữ liệu miễn phí", mà dường như là sự thỏa hiệp giữa lập trình dễ dàng và cho phép các cơ hội biên dịch và phần cứng tối ưu hóa. Một cuộc đua dữ liệu được xác định xảy ra nếu hai truy cập đến cùng một vị trí bộ nhớ bởi các luồng khác nhau không được sắp xếp, ít nhất một trong số chúng lưu trữ đến vị trí bộ nhớ, và ít nhất một trong số chúng không phải là một hành động đồng bộ hóa. Nó ngụ ý rằng tất cả truy cập đọc/ghi vào dữ liệu chia sẻ phải thông qua một số cơ chế đồng bộ hóa, chẳng hạn như mutexes hoặc hoạt động trên các biến nguyên tử (tốt, có thể hoạt động trên các biến nguyên tử với bộ nhớ thoải mái đặt hàng cho các chuyên gia chỉ, nhưng mặc định cung cấp cho tính nhất quán tuần tự).
Trong điều kiện này, tôi bị nhầm lẫn về các hạn chế về tải hoặc lưu trữ giả mạo hoặc đầu cơ trên các biến chia sẻ thông thường. Ví dụ, trong N2338 chúng ta có ví dụ
switch (y) {
case 0: x = 17; w = 1; break;
case 1: x = 17; w = 3; break;
case 2: w = 9; break;
case 3: x = 17; w = 1; break;
case 4: x = 17; w = 3; break;
case 5: x = 17; w = 9; break;
default: x = 17; w = 42; break;
}
mà trình biên dịch không được phép chuyển đổi thành
tmp = x; x = 17;
switch (y) {
case 0: w = 1; break;
case 1: w = 3; break;
case 2: x = tmp; w = 9; break;
case 3: w = 1; break;
case 4: w = 3; break;
case 5: w = 9; break;
default: w = 42; break;
}
vì nếu y == 2 có một ghi giả mạo để x mà có thể là một vấn đề nếu một luồng khác đang cập nhật đồng thời x. Nhưng, tại sao đây lại là một vấn đề? Đây là một cuộc đua dữ liệu, dù sao cũng bị cấm; trong trường hợp này, trình biên dịch chỉ làm cho nó tồi tệ hơn bằng cách viết thành x hai lần, nhưng ngay cả một lần viết đơn sẽ là đủ cho một cuộc đua dữ liệu, phải không? I E. một chương trình C++ 0x thích hợp sẽ cần phải đồng bộ hóa quyền truy cập vào x, trong trường hợp đó sẽ không còn là cuộc đua dữ liệu nữa và cửa hàng giả mạo cũng không phải là vấn đề?
Tôi cũng bị nhầm lẫn tương tự về Ví dụ 3.1.3 trong N2197 và một số ví dụ khác, nhưng có thể giải thích cho vấn đề trên sẽ giải thích điều đó.
EDIT: Trả lời:
Lý do tại sao các cửa hàng đầu cơ là một vấn đề là trong ví dụ câu lệnh switch ở trên, các lập trình viên có thể được bầu vào điều kiện được khóa bảo vệ x chỉ khi y = 2! Do đó các cửa hàng đầu cơ có thể giới thiệu một cuộc đua dữ liệu mà không có trong mã ban đầu, và việc chuyển đổi như vậy là bị cấm. Cùng một đối số cũng áp dụng cho Ví dụ 3.1.3 trong N2197.
Có thể một cho http://groups.google.com/group/comp.std.c++ –