为什么libc ++的shared_ptr实现使用全内存屏障而不是放松?

时间:2015-01-28 18:01:36

标签: c++ boost thread-safety shared-ptr libc++

shared_ptr的推动实施中,它使用了relaxed memory ordering to increment its reference count。这似乎是安全的,因为减量使用获取/释放来确保在释放内存之前线程可以看到任何先前的减量。此方法似乎正确并出现在Herb Sutters talk on atomics

在libc ++中,实现使用full memory barriers

template <class T>
inline T
increment(T& t) _NOEXCEPT
{
    return __sync_add_and_fetch(&t, 1);
}

template <class T>
inline T
decrement(T& t) _NOEXCEPT
{
    return __sync_add_and_fetch(&t, -1);
}

}  // name

这个决定有理由吗?它们之间是否有任何性能或安全差异?

1 个答案:

答案 0 :(得分:33)

因为当我编写代码时,编译器(clang)还没有实现C ++ 11原子。我从来没有回过头去清理它。

这里没什么微妙的。 : - )