在boost的实现中shared_ptr
, 它用放松内存排序以增加其引用计数 https://github.com/boostorg/smart_ptr/blob/master/include/boost/smart_ptr/detail/sp_counted_base_clang.hpp#L29。这看起来很安全,因为递减使用获取/释放来确保在释放内存之前任何先前的递减对线程可见。这个方法似乎是正确的并且出现在 Herb Sutters 中谈论原子 http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Herb-Sutter-atomic-Weapons-1-of-2
在libc++的实现中使用完整的内存屏障 http://llvm.org/svn/llvm-project/libcxx/trunk/src/memory.cpp
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 原子。我再也没有回去清理它。
这里没什么微妙的。 :-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)