我正在尝试提供一种线程安全的方式来更新对象。我看过一些关于它的帖子,但没有什么能 100% 回答我的问题。
我想要做的是维护一个名为“m_First”的指针来指向我的数据。如果有人调用 get,我会尊重该指针,返回对它指向的对象的引用。
如果有人调用 set,传入一个指向新对象的指针,我们将该指针添加到我们的列表并更新 m_First 以指向新对象。
我将对象存储在一个向量中,这样我们就可以在完成后清理内存。
目前我定义了这些成员:
std::vector<MyObject*> m_List;
const MyObject* m_First;
首先是这样初始化的。m_First = m_List.back();
我想允许多个线程读取 m_First,同时多个线程也写入 m_First。
我的班级有两种方法
MyObject& getMyObject() {return *m_First;}
void setMyObject(MyObject* newObj) {
m_List.push_back(newObj); // add to list so we can later cleanup mem
do {
Node* oldHead = m_First;
} while (!__sync_bool_compare_and_swap(m_First, *oldHead, *newObj));
}
我想知道的是,在 get 方法线程安全中返回 *m_First 。即我可以安全地取消引用它并返回对对象的引用,而另一个线程正在尝试更新 m_First,或者我是否需要使用某种原子方法来读取 m_First。
任何建议/帮助将不胜感激。