在 shared_ptr
的 boost 实现中,它使用了 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
这个决定有什么理由吗?它们之间是否有任何性能或安全差异?
最佳答案
因为当我编写该代码时,编译器 (clang) 尚未实现 C++11 原子。我再也没有回来清理它。
这里没有什么微妙之处。 :-)
关于c++ - 为什么 libc++ 的 shared_ptr 实现使用完整的内存屏障而不是放松的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28199212/