オブジェクトを更新するスレッドセーフな方法を提供しようとしています。それについての投稿をいくつか見ましたが、私の質問に 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 に書き込みできるようにしたいと考えています。
私のクラスには2つのメソッドがあります
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 を読み取るためにある種のアトミック メソッドを使用する必要がありますか。
アドバイス/ヘルプをいただければ幸いです。