0

我正在尝试提供一种线程安全的方式来更新对象。我看过一些关于它的帖子,但没有什么能 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。

任何建议/帮助将不胜感激。

4

2 回答 2

0

为了确保从内存而不是寄存器中读取值,您需要进行原子读取。

有不同的方法可以实现这一目标。在某些系统上,通过 volatile 指针强制转换来读取对齐的字长值是*(const volatile MyObject*)p可行的。但是由于您已经在使用内置的原子操作,您可以使用__sync_add_and_fetch添加 0 之类的东西。

于 2012-07-13T17:10:55.223 回答
0

我想允许多个线程读取 m_First,同时多个线程也写入 m_First。

多个线程将如何写入m_First?如果通过了,setMyObject那么他们都会m_List同时修改向量,这将是一场数据竞争,几乎肯定会破坏向量。

于 2012-07-13T17:17:41.890 回答