にゃははー

はへらー

スレッドアンセーフなshared_ptr

多分みなさんはstd::shared_ptrを使ってるとシングルスレッドで使うんだからスレッドアンセーフでいいのにとか思うことが良くありすぎて再実装したくなると思います。ならない方はなって下さい。設計が悪いと言う人はrecursive mutexを今後使わないで下さい。

はい。

で、libstdc++にはそういう拡張があるらしいです。 ドキュメントにはないけど。

基本的に使い方はstd::shared_ptr(と関連するもの)と同じだけど、第二テンプレート引数を受け取る点が違ってて、このテンプレート引数でMT-safe-nessを指定する感じになっている。

bits/shared_ptr_base.h melpon.org

執筆時点で定義されているのは3通り

  • 完全にunsafe
  • ミューテックスを使ってアトミックにカウント
  • アトミックカウンタを使ってアトミックにカウント

ext/concurrence.h

デフォルトのポリシーはスレッドサポートがあるかどうかとCPUのアトミック命令のサポートがあるかどうかで変わるぽいです。

なので、明示的にstd::_S_singleを渡せばMT-unsafeなshared_ptrが手に入ります。 ヤッター!