2008-01-01から1ヶ月間の記事一覧

boost::enable_shared_from_this

boost::shared_ptr を使ってると時々問題になるのが、this の扱い。this は生のポインタなので出来る限り触りたくない、けれどもどうしても this が必要になる場合があったりする。例えばダブルディスパッチとか。 そういった this のスマートポインタが欲し…

random_range_generator

ある一意な確率で出現する範囲の乱数を得るために 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 を利用した Substring

C++

もし Immutable な文字列クラスを作った場合、文字列の一部を切り出すときもわざわざ新しくメモリを確保しなくても取り出すことが出来るような気がしてきた。 /* final */ class string { private: const boost::shared_ptr<wchar_t> str_; const int first_; const i</wchar_t>…

Boost.Bind のプレースホルダーの仕組み

を調べるために、超簡単な 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>…

Boost.Bind を C# で作りたい(3)

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…

Boost.Bind を C# で作りたい(2)

とりあえず全部の引数を束縛するのであれば簡単に作れるようだ。 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>…

Boost.Bind を C# で作りたい

と思ったんだけどどうすればいいんだろう。

async_delegate

汎用的に非同期メッセージを投げて戻り値を返してくれるクラスを作りました。 async_delegate::invoke に関数を設定すると、その関数を別スレッドから呼び出します。 async_delegate::invoke の戻り値である async_result_ptr を使って、同期処理を行い、呼…

Boost.Thread に interrupt 機構は無い

Java の interrupt 機構みたいなのは Boost.Thread に無いみたいなんですね。 いろいろ調べてみた結果 interruptable_mutex.h というのが存在するということが分かったのですが、いまいち使い方が分かりません。 あとスペルは interruptable ではなくて inte…

Boost.WeakPtr を通常のポインタの代替として使う

例えば数百万行ぐらいの大きいソースがあって、そこでは生のポインタがバリバリ使われていたとする。 で、あるマネージャクラスが生成したオブジェクトのポインタをいろんなところにコピーしているので、終了時にマネージャクラスがそのポインタを先に削除す…

Future

デザインパターン(マルチスレッド)まとめ 非同期メッセージの戻り値を受け取るためのパターン これ、C# の同期メソッドの非同期呼び出しで使われてるパターンと同じなのかな。 data クラスは IAsyncResult に対応して、host クラスは Begin〜, End〜 を持…

Worker Thread

デザインパターン(マルチスレッド)まとめ スレッドを起動する時間をケチるのと、スレッド数の管理を行うパターン。 以下は増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編のサンプルを Boost.Thread を使って書いたコード。 これ、reques…

Thread-Per-Message

デザインパターン(マルチスレッド)まとめ 非同期メッセージの投げっぱなしバージョン。 戻り値が欲しい場合は Future パターンを使用する。 以下は増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編のサンプルを Boost.Thread を使って書い…

Immutable のメモ

デザインパターン(マルチスレッド)まとめ Immutable は以下の場合に使用できる インスタンスの生成後、状態(メンバ)が変化しないとき このとき、setter メソッドが無いというだけでは不十分で、メンバが参照している先のインスタンスも変化しない必要が…

Single Thread Execution のメモ

デザインパターン(マルチスレッド)まとめ Single Thread Execution は、以下の場合に使用される。 マルチスレッドの場合 SharedResource 役が複数のスレッドからアクセスされる場合 状態(メンバ)が変化する可能性があるとき デッドロックになる可能性が…

Before/After クラス

デザインパターンの一つに Before/After パターンというのがあるらしくて、これは Before 処理をしたら After 処理を必ず行うように保証するパターンらしい。 Java ならこんな風に書ける public void func() { hoge.before(); try { doSomething(); } finall…

Read-Write Lock

デザインパターン(マルチスレッド)まとめ 書き込みを行っている場合にだけ排他制御を行うパターン。 Boost には read_write_mutex というのがあって、これを使えば Read-Write Lock を実現することがでk……ってバージョン1.34.1 だとドキュメントにはある…

final クラス

Java のマルチスレッドなコードを読んでいると、不変性を保つために final が使用されていることが多い。 public final class Immutable { private final String field1; private final String field2; ... } final メンバは const で代用できるとして、fina…

Producer-Consumer

デザインパターン(マルチスレッド)まとめ あるスレッドから別のスレッドにデータを渡すためのパターン。 というか Guarded Suspension とどう違うのかよく分かんない。 中身はほとんど同じだけど、その目的が違うのかなぁ……。 以下は増補改訂版 Java言語で…