为什么 libc++ 的 shared_ptr 实现使用完整的内存屏障而不是放松的?
Why does libc++'s implementation of shared_ptr use full memory barriers instead of relaxed?
在 shared_ptr
的 boost 实现中,它使用 relaxed memory ordering to increment its reference count. This appears safe as decrements use acquire/release to make sure that any previous decrements are visible to the thread before releasing memory. This method seems correct and appears in 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 原子。而且我再也没有回去清理它。
这里没有什么微妙之处。 :-)
在 shared_ptr
的 boost 实现中,它使用 relaxed memory ordering to increment its reference count. This appears safe as decrements use acquire/release to make sure that any previous decrements are visible to the thread before releasing memory. This method seems correct and appears in 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 原子。而且我再也没有回去清理它。
这里没有什么微妙之处。 :-)