C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 为什么boost :: shared_ptr中的引用计数器不是volatile?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在boost :: shared_ptr析构函数中,完成了:
if(--*pn == 0)
{
    boost::checked_delete(pX);
    delete pn;
}

其中pn是指向引用计数器的指针,该引用计数器的类型为

shared_ptr::Count_Type -> detail::atomic_count -> long

虑到线程的使用以及上面的shared_ptr析构函数中的非原子0检查和删除,我本来期望long可以很长.为什么不变化?

编辑:

事实证明,我查看了未指定多线程使用时使用的标头(atomic_count.hpp).在atomic_count_win32.hpp中,为多线程用法正确实现了减量.

解决方法

因为volatile不是多线程所必需的,并且没有任何益处,但可能会破坏许多优化.

为了确保对变量的安全多线程访问,我们需要的原语是一个内存屏障,它既提供了volatile的保证又提供了其他一些(它阻止了内存访问重新排序跨越屏障,volatile不会这样做)

我相信shared_ptr尽可能使用原子操作,这隐含地提供了内存屏障.否则它会回落到互斥锁,这也会提供内存屏障.

有关详细信息,请参阅Why is volatile not considered useful in multithreaded C or C++ programming?http://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded-programming/

编辑Count_Type在一般情况下不长.它可以转换成很长的.如果你查看atomic_count.hpp,只有在没有可用的线程时才会应用typedef to long(在这种情况下,当然不需要同步).否则,它使用boost / smart_ptr / detail / atomic_count_pthreads.hpp或boost / smart_ptr / detail / atomic_count_win32.hpp或列出的其他文件中定义的实现.这些是同步包装类,确保所有操作都以原子方式完成.

大佬总结

以上是大佬教程为你收集整理的c – 为什么boost :: shared_ptr中的引用计数器不是volatile?全部内容,希望文章能够帮你解决c – 为什么boost :: shared_ptr中的引用计数器不是volatile?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。