これは、汎用アトミックスワップ関数の正しい実装ですか?私は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
を必要とし、それはdoesnの署名Data *swap_data(Data *new_data)
を持っているので、それは私の質問に答えていないリリースしないとこのようになります私のコードを呼び出しますswap
機能についてはまったく意味がないようです。 (実際には、提供された引数を関数の前に定義されたグローバル変数でスワップします)。
「a」へのアクセスはアトミックであると思われますか? –
なぜ車を再発明するのですか? http://concurrencykit.org/ –
@BenVoigtを参照してください。その投稿は明確な答えを示していません。それはグローバル変数で引数を交換します。 – StackedCrooked