boost::smart_ptrの排他制御を調べてみる(2)

つづきです。(前回:http://d.hatena.ne.jp/mojaro/20100207/1265524839

あのあとboostのソースを眺めていたら、気になる記述が。
boost/detail/sp_counted_base.hpp

#if defined( BOOST_SP_DISABLE_THREADS )
# include <boost/smart_ptr/detail/sp_counted_base_nt.hpp>

BOOST_SP_DISABLE_THREADS?? もしかしてと思い、頭に#defineを入れてみたら
普通にスレッド利用しない実装に変更できました。知らんかった・・・。

#include <iostream>	// cout
#define BOOST_SP_DISABLE_THREADS  // ここを追加。
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
// (後略)

これで、lock/unlockはかからなくなります。めでたしめでたし。(って、はやく教えてほしかった・・・)

ただ、ちょっと気になるのは、これを定義した上で、逆にshared_ptr側でロックしてもらいたい場合とかどうなるの? と。

shared_ptrに格納するクラスがすべてスレッドセーフになっているとすれば、shared_ptr側でlock処理を行う方が無駄もないし都合がいいです。また、すべてのクラスがスレッドアンセーフだったとすれば、どっちにしろ同期処理は自前で行わなければならないので、BOOST_SP_DIABLE_THREADSで問題ない。

ただ、現実問題として、少なくとも私の周辺ではそこまでスレッドセーフが徹底できてないし、スレッドセーフ・アンセーフに関わらず両方格納できたらいいなあと。(その辺がまずいのか?)

その辺の設定をpolicyでとるような実装にしちゃえばいいのに、と私なんかでも思うのですが、cppllのboostドキュメント和訳を見ると、

Q. なぜ shared_ptr は、拡張のためのポリシーや特性を与えるための テンプレートパラメータを持たないのか。

A. パラメータ化することは、ユーザを敬遠させることに繋がる。 この shared_ptr テンプレートは、 拡張可能なパラメータを必要とせずに一般的なニーズを満たすように注意深く設計されている。 いつかは、高い拡張性を持ち、非常に使い易く、且つ誤用されにくいスマートポインタが開発されるかも知れない。 しかしそれまでは、shared_ptr が幅広い用途に使用されるだろう。 (そのようなパラメータ化されたポリシー指向のスマートポインタについて興味があるならば、 Andrei Alexandrescu の Modern C++ Design を読むべきである。)

http://boost.cppll.jp/HEAD/libs/smart_ptr/shared_ptr.htm#FAQ

とか書いているので、難しいのかしらん。なにかいい方法あるのかな?