Sharable/Unsharableは置いといて、

Thread A             Thread B

delete O1呼び出し         O2 = O1 (otherがO1)

data_->cs.Lock();         other.data_->cs.Lock()
if (--data_->refs < 1)
  bDelete = true;
data_->cs.Unlock();
if (bDelete)             data = other.data;
  delte data;            ++data_->refs;
                     other.data_cs.Unlock()


例のコードではStringなので、ロック後解放済みだったら空の文字列
を返せばよいのですが、実際には目的のデータであることを確認後
Thread BはO1のコピーのO2を手に入れようとしているので困ってます。

目的のデータがあるかどうかの検索の最初から、コピーを手に入れるまで
と解放処理を呼び出すのもまるっきり排他制御すればできるのは明らかで
すが、極端にパフォーマンスが落ちてしまいます。