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
とか書いているので、難しいのかしらん。なにかいい方法あるのかな?