【发布时间】:2012-01-25 13:12:03
【问题描述】:
这是通用原子交换函数的正确实现吗?我正在寻找 GCC 上兼容 C++03 的解决方案。
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),这对于swap 函数。 (它实际上将提供的参数与在函数之前定义的全局变量交换。)
【问题讨论】:
-
看起来只有对
a的访问应该是原子的? -
为什么要重新发明轮子?看concurrencykit.org
-
@BenVoigt 那篇文章没有给出明确的答案。并将参数与全局变量交换。