/ 最近 .rdf 追記 編集 設定 本棚

log[20130624] Sakura Editor / PatchUnicode / #618 Singletonの実装変更



20130624()

最終更: 2013-07-14T00:41+0900

[C++][SakuraEditor] Sakura Editor / PatchUnicode / #618 Singletonの実装変更

静的変数の初期化とマルチスレド安全性C++11より前と VCに関してはお寒い状況らしいがそもそものコドが素朴なものだった

もともとマルチスレド対応ではないので静的変数で実装するのは大差ないとして(マルチスレド対応コドを自分自身で書く機会を放棄することにはなる?)唯一性の保証を TSingleton利用者に期待するというなら TSingletonはただグローバルアクセサを定義する手段になってしまうこの assertで従来通りの保証ができるかなと思ったんだけど

TSingleton(){ assert(this == static_cast<TSingleton<T>*>(T::getInstance())); }

static変数の初期化にロックがかかってたらこれはデドロックを引き起こすんでない?ロックせず素通りしてしまうと未初期化オブジトを使用してしまうおそれがあるよね? C++11に対応した gccはどうやってるんだろ

ッチの目的はデトラクタが呼ばれるようになることにあるらしいが一方で任意のタイミングでオブジトを破棄することはできなくなるそれはシングトンオブジトにはそぐわない扱いかもしれないけど

本当に stackoverflowのコドを利用するなら継承をやめたらいいそうすれば TSingletonの利用者などというものは存在せずシングトンクラスの実装者しかいなくなる実装を提供するだけならマクロでもできるしあえて継承にする理由は一元的にイスタス作成を補足することではないかと偽りの名前を与えられた中途半端な実装を別ファイルに隔離するのはどうかと思う


3回ぐらいコメトの下書きをしてるけどぐるぐるしてまとまらなくてこの日記になる


 @2013-06-25

スタス変数を関数内staticではなくクラス内staticにするとスを取得するのに getInstanceを呼ぶ必要がなくなってgetInstanceとコトラクタ呼び出しがネトしなくなってロックの可能性(そんなものが実在するかは gccがないので知らない)が消えると思ったんだけどすべてのシングトンオブジトの初期化がプログラム起動時に走ってしまいそうだこれを避けるとイスタスをポインタで保持することになってこれは現在のコドだスタスを関数内staticで保持したままgetInstanceでそのスだけをクラス内static変数にコピーするとかいうのトリッキーなわりに利がなくて目的を見失ってる感

クラスで実装するシングトンってなんのためにあるんだろうねアプリケーションクラスだけがシングトンでそれ以外はそのメンバでいいやんJavaとか C#Main関数みたいな居心地の悪さがあるかしらんけどさ


 @2013-07-12 クリカルセクションは他スレドを閉め出すもの

同じスレドであれば同じCRITICAL_SECTIONを引数にして何度でも EnterCriticalSectionできるらしい(同じ回数の LeaveCriticalSectionが必要)

各スレドはクリカルセクションの所有権を取得した後は自らの実行をブロックすることなくEnterCriticalSection または TryEnterCriticalSection 関数を追加で呼び出すことができます。この結果スレドが既に自ら所有しているクリカルセクションを待機しようとしてデドロックに陥ることを防止できます。

EnterCriticalSection 関数

というわけでコンパイラが静的変数の初期化を実際どう実装するかは知らんけどあまり気にせず上の方に書いた assertを使っていいんじゃないかな

イベトを使ったのはこのとき(20130416)が初めてでクリカルセクションはまだ使ったことがないのでしたたぶんその存在はペゾドさんの本で読んだんだろうなあ。9年前