什么机制可以确保std::shared_ptr控制块是线程安全的



从std::shared_ptr线程安全等文章中,我知道标准保证std::shared_ptr的控制块是线程安全的,而实际指向的数据本身并不是线程安全的(即,这取决于我作为用户(。

我在研究中找不到的是如何保证这一点的答案。我的意思是,特别是使用了什么机制来确保控制块是线程安全的(因此对象只删除一次(?

我之所以这么问,是因为我正在将newlib nano C++库与FreeRTOS一起用于嵌入式系统。这两者并非天生就可以相互配合。由于我从未编写任何代码来确保控制块是线程安全的(例如,没有用于关键部分或互斥对象的代码(,我只能假设它实际上可能不是FreeRTOS线程安全的。

这并不需要太多的机器。对于粗略草图(不包括标准std::shared_ptr的所有要求/特征(:

您只需要确保引用计数器是原子计数器,它是原子递增/递减的,并使用获取/释放语义进行访问(实际上,有些访问甚至可以放松(。

然后,当给定控制块的共享指针的最后一个实例被破坏并且它将引用计数递减到零时(这需要使用例如CCD_,析构函数知道不再有其他线程持有对控制块的引用,它可以简单地销毁托管对象并清理控制块。

MSVC使用InterlockedIncrement来增加refcount,这是一个原子增量。

通过查看C++库代码,我的最佳猜测是引用计数是作为原子操作实现的。我认为所有的代码最终都可以归结为一组内置函数,由编译器为我使用的特定体系结构(ARM(实现。以下是GCC提供的内置组件列表:https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

相关内容

  • 没有找到相关文章

最新更新