2008-01-01から1ヶ月間の記事一覧
boost::shared_ptr を使ってると時々問題になるのが、this の扱い。this は生のポインタなので出来る限り触りたくない、けれどもどうしても this が必要になる場合があったりする。例えばダブルディスパッチとか。 そういった this のスマートポインタが欲し…
ある一意な確率で出現する範囲の乱数を得るために variate_generator を使って乱数を取り出してたんだけど、variate_generator は一度作ったら範囲を変更できない。 なので、 // [first, last) int rnd = boost::variate_generator<boost::mt19937, boost::uniform_int<int> >(mt_, boost::uniform_int<int></int></boost::mt19937,>…
もし Immutable な文字列クラスを作った場合、文字列の一部を切り出すときもわざわざ新しくメモリを確保しなくても取り出すことが出来るような気がしてきた。 /* final */ class string { private: const boost::shared_ptr<wchar_t> str_; const int first_; const i</wchar_t>…
を調べるために、超簡単な Boost.Bind を作ってみた。 namespace my_boost { // arg template<int I> class arg { }; template<int I> bool operator==(arg<I> const &, arg<I> const &) { return true; } // type template<class T> class type { }; namespace _bi { // storage1 template<class A1></class></class></i></i></int></int>…
public static class Boost { public class PlaceHolder { public PlaceHolder(int v) { Value = v; } public int Value; } public static PlaceHolder _1 = new PlaceHolder(1); public static PlaceHolder _2 = new PlaceHolder(2); public static PlaceHo…
とりあえず全部の引数を束縛するのであれば簡単に作れるようだ。 delegate R Function<R>(); delegate R Function<R, T1>(T1 t1); delegate R Function<R, T1, T2>(T1 t1, T2 t2); // 以下略 Function<R> Bind<R>(Function<R> f) { return delegate { return f(); }; } Function<R> Bind<R, T1>(Funct</r,></r></r></r></r></r,></r,></r>…
と思ったんだけどどうすればいいんだろう。
汎用的に非同期メッセージを投げて戻り値を返してくれるクラスを作りました。 async_delegate::invoke に関数を設定すると、その関数を別スレッドから呼び出します。 async_delegate::invoke の戻り値である async_result_ptr を使って、同期処理を行い、呼…
Java の interrupt 機構みたいなのは Boost.Thread に無いみたいなんですね。 いろいろ調べてみた結果 interruptable_mutex.h というのが存在するということが分かったのですが、いまいち使い方が分かりません。 あとスペルは interruptable ではなくて inte…
例えば数百万行ぐらいの大きいソースがあって、そこでは生のポインタがバリバリ使われていたとする。 で、あるマネージャクラスが生成したオブジェクトのポインタをいろんなところにコピーしているので、終了時にマネージャクラスがそのポインタを先に削除す…
デザインパターン(マルチスレッド)まとめ 非同期メッセージの戻り値を受け取るためのパターン これ、C# の同期メソッドの非同期呼び出しで使われてるパターンと同じなのかな。 data クラスは IAsyncResult に対応して、host クラスは Begin〜, End〜 を持…
デザインパターン(マルチスレッド)まとめ スレッドを起動する時間をケチるのと、スレッド数の管理を行うパターン。 以下は増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編のサンプルを Boost.Thread を使って書いたコード。 これ、reques…
デザインパターン(マルチスレッド)まとめ 非同期メッセージの投げっぱなしバージョン。 戻り値が欲しい場合は Future パターンを使用する。 以下は増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編のサンプルを Boost.Thread を使って書い…
デザインパターン(マルチスレッド)まとめ Immutable は以下の場合に使用できる インスタンスの生成後、状態(メンバ)が変化しないとき このとき、setter メソッドが無いというだけでは不十分で、メンバが参照している先のインスタンスも変化しない必要が…
デザインパターン(マルチスレッド)まとめ Single Thread Execution は、以下の場合に使用される。 マルチスレッドの場合 SharedResource 役が複数のスレッドからアクセスされる場合 状態(メンバ)が変化する可能性があるとき デッドロックになる可能性が…
デザインパターンの一つに Before/After パターンというのがあるらしくて、これは Before 処理をしたら After 処理を必ず行うように保証するパターンらしい。 Java ならこんな風に書ける public void func() { hoge.before(); try { doSomething(); } finall…
デザインパターン(マルチスレッド)まとめ 書き込みを行っている場合にだけ排他制御を行うパターン。 Boost には read_write_mutex というのがあって、これを使えば Read-Write Lock を実現することがでk……ってバージョン1.34.1 だとドキュメントにはある…
Java のマルチスレッドなコードを読んでいると、不変性を保つために final が使用されていることが多い。 public final class Immutable { private final String field1; private final String field2; ... } final メンバは const で代用できるとして、fina…
デザインパターン(マルチスレッド)まとめ あるスレッドから別のスレッドにデータを渡すためのパターン。 というか Guarded Suspension とどう違うのかよく分かんない。 中身はほとんど同じだけど、その目的が違うのかなぁ……。 以下は増補改訂版 Java言語で…