我實現了一個引用計數模式,爲此我需要互鎖功能但沒有內存隔離(據我瞭解)。如何實現沒有內存障礙的InterlockedIncrement
不幸的是,只有Windows有一個InterlockedDecrementNoFence編譯器。 我如何使用asm內聯做到這一點?我也需要這個gcc/clang。
我實現了一個引用計數模式,爲此我需要互鎖功能但沒有內存隔離(據我瞭解)。如何實現沒有內存障礙的InterlockedIncrement
不幸的是,只有Windows有一個InterlockedDecrementNoFence編譯器。 我如何使用asm內聯做到這一點?我也需要這個gcc/clang。
對於這個操作的語義來說,缺少至少一個內在的內存圍欄操作(取決於平臺)幾乎是不可能的。爲了使原子增量/減量工作,另一個處理器必須保證在對變量執行自己的操作之前查看原子操作的值,並且操作對變量的可見性必須具有一定的保證總數訂購。內存障礙,即使是像x86這樣的強存儲器模型(其中標準內存操作獲取/釋放語義)等隱式障礙,對於原子增量/減量操作的正確性也是至關重要的。請記住,即使MSVC/gcc的文檔說存在內存障礙,在x86上也不會有實際的內存障礙應用(即MFENCE
指令),這是由於強記憶模型該平臺,而是鎖定存儲器總線以確保操作的原子性。另一方面,由於該平臺的內存模型較弱,IA64需要內存屏障。 ARM也是如此。
這不是一個直接的答案,而是一個替代方案。如果您可以使用C11(或C++ 11),那麼如何使用memory_order_relaxed
進行原子操作?您的編譯器可能會在弱內存模型平臺上生成無內存柵欄。 (這取決於編譯器供應商/版)
#include <stdatomic.h>
atomic_int var;
int oldval;
oldval = atomic_fetch_sub_explicit(&var, 1, memory_order_relaxed);
嗯...內聯彙編會在MSVC和gcc是不同的......反正和阻擋更好保持原來的位置。 –