スレッドアンセーフなshared_ptr
多分みなさんはstd::shared_ptrを使ってるとシングルスレッドで使うんだからスレッドアンセーフでいいのにとか思うことが良くありすぎて再実装したくなると思います。ならない方はなって下さい。設計が悪いと言う人はrecursive mutexを今後使わないで下さい。
はい。
で、libstdc++にはそういう拡張があるらしいです。 ドキュメントにはないけど。
基本的に使い方はstd::shared_ptr(と関連するもの)と同じだけど、第二テンプレート引数を受け取る点が違ってて、このテンプレート引数でMT-safe-nessを指定する感じになっている。
bits/shared_ptr_base.h melpon.org
執筆時点で定義されているのは3通り
- 完全にunsafe
- ミューテックスを使ってアトミックにカウント
- アトミックカウンタを使ってアトミックにカウント
デフォルトのポリシーはスレッドサポートがあるかどうかとCPUのアトミック命令のサポートがあるかどうかで変わるぽいです。
なので、明示的にstd::_S_single
を渡せばMT-unsafeなshared_ptr
が手に入ります。
ヤッター!