Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么libc++';s共享ptr的实现使用完整的内存屏障,而不是放松?_C++_Boost_Thread Safety_Shared Ptr_Libc++ - Fatal编程技术网

C++ 为什么libc++';s共享ptr的实现使用完整的内存屏障,而不是放松?

C++ 为什么libc++';s共享ptr的实现使用完整的内存屏障,而不是放松?,c++,boost,thread-safety,shared-ptr,libc++,C++,Boost,Thread Safety,Shared Ptr,Libc++,在boost的共享ptr实现中,它使用了。这看起来是安全的,因为减量在释放内存之前使用acquire/release确保线程可以看到以前的减量。这种方法似乎是正确的,出现在Herb Sutters中 在libc++的实现中使用 模板 内联T 增量(T&T)\无例外 { 返回\u同步\u添加\u和\u获取(&t,1); } 模板 内联T 减量(T&T)\无例外 { 返回\uuuu sync\u add\u和\u fetch(&t,-1); } }//名称 这个决定有什么理由吗?它们之间是否存在性

在boost的
共享ptr
实现中,它使用了。这看起来是安全的,因为减量在释放内存之前使用acquire/release确保线程可以看到以前的减量。这种方法似乎是正确的,出现在Herb Sutters中

在libc++的实现中使用

模板
内联T
增量(T&T)\无例外
{
返回\u同步\u添加\u和\u获取(&t,1);
}
模板
内联T
减量(T&T)\无例外
{
返回\uuuu sync\u add\u和\u fetch(&t,-1);
}
}//名称

这个决定有什么理由吗?它们之间是否存在性能或安全差异

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


这里没有什么微妙之处。:-)

根据,它说“为了满足线程安全要求,引用计数器通常使用std::atomic::fetch\u add和std::memory\u order\u released的等价物递增和递减。”我希望找到它的源代码来确认这条语句,但我在查找gcc的libc++源代码的在线文档时遇到了困难(尽管它们只是简单的谷歌搜索,也许有人可以提供链接)。我注意到你的链接是针对LLVM的。代码是谁写的,什么时候写的,为什么写的,还有其他什么。。。要是有办法找到答案就好了@Aggieboy我认为我链接的镜像也是GCC上libc++的源代码,您只需使用
-GCC工具链编译它即可。libstd++(GCC上的默认标准库)使用了
\uu gnu\u cxx::\uu交换和添加
,我认为这也是一个完全的障碍,但我不确定。这似乎是一个常识,它应该通过放松的障碍来实现,但除了boost之外,我似乎找不到任何库it@UlrichEckhardt我愿意接受一些体面的评论:P。我只是好奇为什么任何STL实现都会违背线程安全引用计数的最佳实践(为了性能)当它显然有能力使用它时(原子存在,就使用它们!)。也许这只是他们如何做到的,但也许更熟悉原子学的人可以解释一下,是否有一个很好的理由这样做只是为了不在这里留下任何不好的氛围,@ChrisT,我想(讽刺地)建议你检查相应的版本控制系统。这就是“责备”或“注释”命令在许多此类系统中的用途。我不确定这是否是一个讽刺……最后,我明白了一个关于原子学的答案!哈,我刚刚得到一个“你没有通过”的答案,当这个答案被显示为“审核”我的评论。。。我将其标记为垃圾邮件,认为没有代表的人(它没有显示真实用户)极不可能编写代码,更不用说其他人现在询问的整个库了:-DAt首先看,我认为这是一个糟糕的自我回答(特别是微笑)。我对审核保持警惕,所以我通过了审核,但这不是一个很好的审核选择。对于本页面的未来访问者来说,这似乎是固定的:
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