Pat*_*ght 0 c++ thread-safety shared-ptr freertos
从std::shared_ptr 线程安全等文章中,我知道 std::shared_ptr 的控制块按标准保证是线程安全的,而指向的实际数据本质上不是线程安全的(即,它是对我来说,作为用户,做到这一点)。
我在研究中未能找到如何保证这一点的答案。我的意思是,具体使用什么机制来确保控制块是线程安全的(因此对象只被删除一次)?
我问这个问题是因为我正在将 newlib-nano C++ 库与 FreeRTOS 一起用于嵌入式系统。这两者本质上并不是为了相互协作而设计的。由于我从未编写过任何代码来确保控制块是线程安全的(例如,没有关键部分或互斥体的代码),因此我只能假设它实际上可能不是 FreeRTOS 线程安全的。
为此实际上并不需要太多机械。粗略的草图(不包括标准的所有要求/功能std::shared_ptr):
您只需要确保引用计数器是原子的,它以原子方式递增/递减并使用获取/释放语义进行访问(实际上某些访问甚至可以放宽)。
然后,当给定控制块的共享指针的最后一个实例被销毁并将引用计数递减为零时(这需要使用egstd::atomic::fetch_add的返回值通过递减进行原子检查),析构函数知道没有其他线程不再持有对控制块的引用,它可以简单地销毁托管对象并清理控制块。