Tôi có bộ nhớ dùng chung giữa nhiều quy trình kết nối bộ nhớ theo một cách nhất định. Ví dụ:Truy cập nguyên tử vào bộ nhớ dùng chung
DataBlock {
int counter;
double value1;
double ... }
Điều tôi muốn cho bộ đếm được cập nhật/tăng lên một cách nguyên tử. Và để phát hành bộ nhớ xảy ra trên địa chỉ đó. Nếu tôi werent sử dụng bộ nhớ chia sẻ, ví dụ, nó sẽ là một cái gì đó giống như
std::atomic<int> counter;
atomic_store(counter, newvalue, std::memory_order_release); // perform release operation on the affected memory location making the write visible to other threads
Làm thế nào để đạt được điều này cho một vị trí bộ nhớ ngẫu nhiên (giải thích được datablock truy cập> ở trên). Tôi có thể đảm bảo địa chỉ được căn chỉnh theo yêu cầu của kiến trúc (x86 linux)
- Cập nhật nguyên tử - cách thực hiện? (tức là atomicupdate (addr, newvalue))
- Đồng bộ hóa bộ nhớ cho đa lõi - (tức là memorysync (addr)) - cách duy nhất tôi có thể thấy là sử dụng std :: atomic_thread_fence (std :: memory_order_release) - nhưng điều này sẽ "thiết lập bộ nhớ thứ tự đồng bộ hóa của tất cả các cửa hàng nguyên tử và thư giãn nguyên tử "- đó là quá mức cần thiết cho tôi - tôi chỉ muốn vị trí bộ đếm được đồng bộ hóa. Đánh giá cao bất kỳ suy nghĩ nào.
Tôi chỉ suy đoán, nhưng tôi ấn tượng rằng mô hình lập trình C++ không có khái niệm "quy trình" và mô hình bộ nhớ không có khái niệm "bộ nhớ dùng chung", vì vậy tôi nghi ngờ rằng bản thân tiêu chuẩn sẽ tạo ra bất kỳ đảm bảo nào. Bộ nhớ chia sẻ là một tính năng phụ thuộc vào nền tảng, vì vậy hãy tham khảo tài liệu về nền tảng của bạn. –
bạn có thể đặt một 'nguyên tử 'vào trong DataBlock của mình không? Điều đó sẽ hoạt động miễn là 'nguyên tử 'là lockfree (tiêu chuẩn rõ ràng đề cập đến bộ nhớ được chia sẻ giữa các quá trình như một trường hợp sử dụng cho những người đó). Và không có bạn không thể chỉ nhận được một nguyên tử cho một địa chỉ ngẫu nhiên (xem http://stackoverflow.com/questions/8749038/how-to-use-stdatomic-efficiently/8749474) @Kerrek SB: thực tế là kịch bản được đề cập trong [atomics.lockfree] trong bản thảo cuối cùng. –
Grizzly
@Grizzly: Bạn có nghĩa là ghi chú không quy định 29.4/3? Rất thú vị, tôi không biết điều đó. –