CARLA
 
载入中...
搜索中...
未找到
AtomicSharedPtr.h
浏览该文件的文档.
1//==============================================================================
2// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
3// de Barcelona (UAB).
4//
5// This work is licensed under the terms of the MIT license.
6// For a copy, see <https://opensource.org/licenses/MIT>.
7//==============================================================================
8
9#pragma once
10
11#include <memory> // for std::shared_ptr
12
13namespace carla {
14
15/**
16 * @brief 线程安全的原子智能指针封装类
17 *
18 * AtomicSharedPtr提供了一个简单的原子操作智能指针实现,支持线程安全的共享指针操作。
19 * 使用release-acquire内存序来确保线程间的正确同步:
20 * - release操作确保在此之前的所有内存写入都对其他线程可见
21 * - acquire操作确保在此之后的所有内存读取都能看到其他线程的release操作
22 *
23 * @tparam T 指针指向的数据类型
24 */
25template <typename T>
27public:
28 //--------------------------------------------------------------------------
29 // 构造函数
30 //--------------------------------------------------------------------------
31
32 /**
33 * @brief 构造函数,完美转发参数到shared_ptr
34 * @tparam Args 可变参数包类型
35 * @param args 构造参数
36 */
37 template <typename... Args>
38 explicit AtomicSharedPtr(Args&&... args)
39 : _ptr(std::forward<Args>(args)...) {}
40
41 /**
42 * @brief 拷贝构造函数
43 * @param rhs 源对象
44 */
46 : _ptr(rhs.load()) {}
47
48 /// 禁用移动构造函数
50
51 //--------------------------------------------------------------------------
52 // 原子操作方法
53 //--------------------------------------------------------------------------
54
55 /**
56 * @brief 原子存储新的智能指针
57 * @param ptr 要存储的新指针
58 */
59 void store(std::shared_ptr<T> ptr) noexcept {
60 std::atomic_store_explicit(
61 &_ptr,
62 ptr,
63 std::memory_order_release // 确保之前的写入对其他线程可见
64 );
65 }
66
67 /**
68 * @brief 重置指针值
69 * @param ptr 新的指针值,默认为nullptr
70 */
71 void reset(std::shared_ptr<T> ptr = nullptr) noexcept {
72 store(ptr);
73 }
74
75 /**
76 * @brief 原子加载当前指针值
77 * @return 当前存储的智能指针
78 */
79 std::shared_ptr<T> load() const noexcept {
80 return std::atomic_load_explicit(
81 &_ptr,
82 std::memory_order_acquire // 确保能看到其他线程的release操作
83 );
84 }
85
86 /**
87 * @brief 原子比较并交换操作
88 * @param expected 预期的指针值
89 * @param desired 希望设置的新值
90 * @return 操作是否成功
91 */
93 std::shared_ptr<T>* expected,
94 std::shared_ptr<T> desired) noexcept {
95 return std::atomic_compare_exchange_strong_explicit(
96 &_ptr,
97 expected,
98 desired,
99 std::memory_order_acq_rel, // 同时具有acquire和release语义
100 std::memory_order_acq_rel
101 );
102 }
103
104 //--------------------------------------------------------------------------
105 // 运算符重载
106 //--------------------------------------------------------------------------
107
108 /**
109 * @brief 智能指针赋值运算符
110 * @param ptr 要赋值的智能指针
111 * @return 当前对象引用
112 */
113 AtomicSharedPtr& operator=(std::shared_ptr<T> ptr) noexcept {
114 store(std::move(ptr));
115 return *this;
116 }
117
118 /**
119 * @brief 拷贝赋值运算符
120 * @param rhs 源对象
121 * @return 当前对象引用
122 */
124 store(rhs.load());
125 return *this;
126 }
127
128 /// 禁用移动赋值运算符
130
131private:
132 std::shared_ptr<T> _ptr; ///< 内部存储的智能指针
133};
134
135} // namespace carla
线程安全的原子智能指针封装类
AtomicSharedPtr(const AtomicSharedPtr &rhs)
拷贝构造函数
AtomicSharedPtr & operator=(std::shared_ptr< T > ptr) noexcept
智能指针赋值运算符
std::shared_ptr< T > _ptr
内部存储的智能指针
AtomicSharedPtr(AtomicSharedPtr &&)=delete
禁用移动构造函数
void store(std::shared_ptr< T > ptr) noexcept
原子存储新的智能指针
AtomicSharedPtr & operator=(AtomicSharedPtr &&)=delete
禁用移动赋值运算符
std::shared_ptr< T > load() const noexcept
原子加载当前指针值
AtomicSharedPtr & operator=(const AtomicSharedPtr &rhs) noexcept
拷贝赋值运算符
bool compare_exchange(std::shared_ptr< T > *expected, std::shared_ptr< T > desired) noexcept
原子比较并交换操作
void reset(std::shared_ptr< T > ptr=nullptr) noexcept
重置指针值
AtomicSharedPtr(Args &&... args)
构造函数,完美转发参数到shared_ptr
CARLA模拟器的主命名空间。
Definition Carla.cpp:139