スレッドごとにローカルなシングルトン(的なもの)

// TODO: あとでちゃんと動作確認 (なお、CodeContract 関連以外は動作確認済みである)

C# でスレッドごとに固有のインスタンスを提供できるようにするという小ネタ。

エントリの変更点

09/02/01
  • スレッドセーフさについて言及を増やした
  • エントリ内部を小見出しで分けた

ただの Singleton

なお、スレッドごと、でなく AppDomain*1ごとの Singleton で良ければ、

sealed class HogeClass{
    /// <summary>Singleton なインスタンス。</summary>
    public static readonly Instance = new HogeClass();
    
    /// <summary>コンストラクタを好きに呼ぶことは出来ない。</summary>
    private HogeClass(){ ... }
}
// 常に同じインスタンスが返ってくる
HogeClass.Instance;

という風に簡潔に実現できる。このような public static readonly を使った本来の意味でのシングルトンはスレッドセーフであり、かつ高速であるので、普通のシングルトンならばこれで問題ない*2

ここで、スレッドに関係なく同じインスタンスが返ってくるところを、下のイメージのようにするのがこのエントリの趣旨である。

// アクセスするスレッドごとに別のインスタンスが返される
// 同じスレッドからなら同じインスタンスが反ってくる
HogeClass.Instance;

*1:乱暴に言うとプロセスみたいなもの

*2:この一文は 09/03/01 に追加した

続きを読む

MessagePack の扱えるプリミティブ型まとめ

参考

MessagePack の C/C++ バインディング上で扱うことの出来るデータ構造を調べてみた。エントリが長くなるのも何なので、プリミティブ型とコンテナ型の二種類に分けてエントリにしてある。ここで、コンテナ型は他の型の値を内包することが出来る型、プリミティブ型は他の値を内包できない型という意味合いである。

なお、ここに書いてある内容は MessagePack の現存する実装などから推測したものに過ぎないので、注意が必要である*1

*1:id:viver によると、今のところ正式な仕様のドキュメントといったものはないそうだ。

続きを読む

MessagePack の扱えるコンテナ型まとめ

MessagePack の C/C++ バインディング上で扱うことの出来るデータ構造に付いてのエントリその 2 である。
その1 はこちら: MessagePackの扱えるプリミティブ型まとめ
このエントリでは、値を任意数格納できるコンテナ型について述べようと思う。

参考: MessagePack公式
参考: id:viver の blog

続きを読む

MessagePack のエンコーディングフォーマット 概要編

MessagePack 互換実装を作るためには、どうあれ MessagePack のエンコーディングがどのようなフォーマットなのか調べる必要がある。
というわけで、まずはフォーマットの概略をまとめてみた。

続きを読む

MessagePack と壊れたデータ

MessagePack のエンコード方式をよく見ていると気づくことだが、MessagePack のフォーマットにおいてはたいていのバリエーションのバイト列が MessagePack のバイナリフォーマットとして合法になる仕様である。したがって、うっかり変な出力をしてしまうプログラム*1が居た場合、その出力をデコードした結果がとんでもないデータになる可能性がある。

*1:とくに PHP などの場合、言語使用などの関係上意図しないバイトが標準出力されてしまうという事故は非常によくあることである。

続きを読む

筑波大学術情報センターの無線 LAN

参考: FreeBSDいちゃらぶ日記

筑波大学で、大学内の学術情報センターというところが提供している学内向けに提供されている無線 LAN というものがあるのだが、この認証機構がこまったさんだという話。

続きを読む