Các khái niệm về một hàng rào biên dịch thường đi lên khi tôi đọc về mô hình bộ nhớ, các rào cản, đặt hàng, Atomics, vv, nhưng thông thường nó trong bối cảnh cũng được kết hợp với một hàng rào CPU, như người ta mong đợi.Khi nào thì rào cản bộ nhớ chỉ biên dịch (chẳng hạn như std :: atomic_signal_fence) hữu ích?
Thỉnh thoảng, tôi đọc về cấu trúc hàng rào mà chỉ áp dụng áp dụng cho trình biên dịch. Một ví dụ của việc này là 11 std::atomic_signal_fence
C++ chức năng, trong đó nêu tại cppreference.com:
std :: atomic_signal_fence tương đương với std :: atomic_thread_fence, ngoại trừ không CPU hướng dẫn bộ nhớ đặt hàng được ban hành. Chỉ sắp xếp lại các hướng dẫn bởi trình biên dịch bị chặn theo thứ tự hướng dẫn.
tôi có năm câu hỏi liên quan đến chủ đề này:
Như ngụ ý của tên
std::atomic_signal_fence
, là một không đồng bộ ngắt (chẳng hạn như một sợi được preempted bởi hạt nhân để thực hiện một xử lý tín hiệu) chỉ trường hợp trong đó chỉ có trình biên dịch chỉ hàng rào là hữu ích?Tính hữu dụng của nó có áp dụng cho tất cả các kiến trúc, bao gồm được đặt hàng được đặt hàng mạnh mẽ như
x86
không?một cụ dụ có thể được cung cấp để chứng minh tính hữu ích của một trình biên dịch chỉ hàng rào?
Khi sử dụng
std::atomic_signal_fence
, có bất kỳ sự khác biệt nào giữa việc sử dụngacq_rel
vàseq_cst
yêu cầu không? (Tôi mong chờ nó làm cho không có sự khác biệt.)Câu hỏi này có thể được bao phủ bởi những câu hỏi đầu tiên, nhưng tôi đủ tò mò muốn hỏi cụ thể về nó anyway: Có bao giờ cần thiết để sử dụng hàng rào với
thread_local
truy cập? (Nếu nó bao giờ sẽ là, tôi mong chờ trình biên dịch chỉ hàng rào nhưatomic_signal_fence
là công cụ của sự lựa chọn.)
Cảm ơn bạn.
Bạn đã kiểm tra chưa? http://preshing.com/20120625/memory-ordering-at-compile-time. –
Trích dẫn preshing.com: "Như tôi đã đề cập, ** các rào cản trình biên dịch đủ để ngăn bộ nhớ sắp xếp lại trên một hệ thống đơn vi xử lý **. Nhưng đó là năm 2012, và những ngày này, tính toán đa lõi là chuẩn. Nếu chúng ta muốn đảm bảo tương tác xảy ra theo thứ tự mong muốn trong một môi trường đa xử lý, và trên bất kỳ cấu trúc CPU nào, thì rào cản trình biên dịch là không đủ. [...] " –
@chico: Tốt điểm- nếu lập trình viên ** biết ** ứng dụng sẽ * * Chỉ ** chạy trên các hệ thống không phải SMP (ví dụ, CPU đơn với lõi đơn ** hoặc ** SMP bị vô hiệu hóa trong hạt nhân vì một lý do nào đó), đó là thứ mà trình biên dịch không thể biết hoặc giả định, sau đó 'atomic_signal_fence' (hoặc một số cấu trúc hàng rào * chỉ biên dịch * khác) có thể được sử dụng như một tối ưu hóa tiềm năng. Như bài báo nói, hạt nhân Linux có các hàm 'smp_rmb' và' smp_wmb' được thực hiện theo cách này. Tuy nhiên, tôi vẫn quan tâm đến việc nghe (các) câu trả lời - nếu tồn tại - không bị hạn chế với giả thiết như vậy. – etherice