単一のオブジェクトではなく、複数のオブジェクトを使用することをお勧めします。オブジェクトを実際に共有する代わりに、オブジェクトとアトミックカウントを保持するオブジェクトを作成してから、スレッド間でこの構造へのポインターを共有します。
[ライターが1つしかない場合]各リーダーはポインターを取得し、カウンターをアトミックにインクリメントし、オブジェクトを使用します。読み取り後、カウンターをアトミックにデクリメントします。ライターは、元のオブジェクトのコピーを保持する新しいオブジェクトを作成し、それを変更します。次に、2つのポインターのアトミックスワップを実行します。ここで問題は古いオブジェクトを解放することです。そのため、リーダーの数が必要になります。ライターは、すべてのリーダーが作業を完了するまで古いオブジェクトの数をチェックし続ける必要があります。その時点で、古いオブジェクトを削除できます。
複数のライターがある場合(つまり、変数を更新するスレッドが複数ある場合)、同じアプローチに従うことができますが、ライターを使用する場合は、ポインターのコンペアアンドスワップ交換を行う必要があります。更新されたコピーが変更されたポインターの場合、ライターはプロセスを再開します(新しいオブジェクトを削除し、ポインターから再度コピーしてCASを再試行します)。