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

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

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/

相关文章:

c++ - Espeak SAPI/dll 在 Windows 上的使用?

c++ - Else 对于多个 if

c++ - map 上的 find_if 问题

c++ - 我们可以从 C++ 代码控制 L2 缓存吗?

c++ - boost::mpl::apply 仅适用于类型化模板参数

java - Java 缓存整个对象还是仅缓存对象的一部分? (可见性问题)

java - 为什么我应该避免在 servlet 中使用 InheritableThreadLocal?

c++ - vector<int*>.push_back() 正在覆盖 front() 指向的值

c++ - Shell使用特定的工作目录执行cmd提示符

c# - 对 Interlocked.CompareExchange 延迟初始化的字段执行定期读取是否正确?