這是通用原子交換函數的正確實現嗎?我在GCC上尋找C++ 03兼容的解決方案。使用gcc原子內置函數的原子交換函數
template<typename T>
void atomic_swap(T & a, T & b) {
static_assert(sizeof(T) <= sizeof(void*), "Maximum size type exceeded.");
T * ptr = &a;
b =__sync_lock_test_and_set(ptr, b);
__sync_lock_release(&ptr);
}
如果不是,我該怎麼辦才能修復它?
另外:是__sync_lock_release
總是有必要的嗎?當通過其他代碼庫進行搜索時,我發現這通常不會被調用。如果不釋放調用我的代碼看起來是這樣的:
template<typename T>
void atomic_swap(T & a, T & b) {
static_assert(sizeof(T) <= sizeof(void*), "Maximum size type exceeded.");
b = __sync_lock_test_and_set(&a, b);
}
PS:Atomic swap in GNU C++是一個類似的問題,但因爲提供的答案需要C++ 11的std::atomic
,它有簽名Data *swap_data(Data *new_data)
它沒有按」它沒有回答我的問題t對於swap
函數似乎是有意義的。 (它實際上是使用在函數前定義的全局變量交換提供的參數。)
它看起來像只訪問'a'應該是原子? –
爲什麼重新發明輪子?看看http://concurrencykit.org/ – 2012-01-27 22:08:57
@BenVoigt那篇文章沒有給出明確的答案。它用一個全局變量交換參數。 – StackedCrooked