[英]Can atomic RMW seq_cst followed and preceded by an atomic load acquire be reordered on x86?
我有如下模式:
std::atomic_uint32_t x{};
std::atomic_bool y{};
void wait_at_y()
{
if (!y.load(std::memory_order_acquire)) // 1
return;
x++; // uses seq_cst by default // 2
// spin until 'y' is set 'false'
while (y.load(std::memory_order_acquire)); // 3
x--; // uses seq_cst by default // 4
}
// function run by N threads
void foo()
{
while (running)
{
wait_at_y();
// do stuff
}
}
以這種方式編寫的wait_at_y()
是否保證在 x86 上1
、 2
、 3
和4
將完全按照這個順序執行,即不重新排序它們中的任何一個? 如果不是,需要什么來防止任何重新排序?原子記憶柵欄可能,如果是的話在哪里?
x、y 都是原子變量,所有操作都是按順序一致性進行的。
是的,1、2、3、4 將完全按照這個順序執行。 您不需要在任何地方插入原子內存柵欄。
但這並不能保證您的程序是正確的。 您可以在其他地方遇到數據競賽。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.