2008-08-25から1日間の記事一覧

ManualResetEvent

スレッド間のやりとりを実現する。 下記の例では、スレッドBはスレッドAの処理が終わるまで待機する。 MSDNにManualResetEventの配列を使ったサンプルがある。また、WaiteOne()後のリセットを自動で行ってくれる。AutoResetEventクラスも存在する。 考え方・…

readonlyとconstの違い

C#

readonlyは宣言時とコンストラクタ内のどちらかで初期化ができる。 constは宣言時のみ初期化ができる。 readonlyはインスタンス毎に別の定数を作ることができる。

volatile(ボラタイル)

private volatile int count_val = 0; 複数のスレッドから参照される可能性のあるメンバにつける。 これをつけると、コンパイラの最適化の対象にならない。メンバのRead/Writeを行う際に 必ずメンバ変数の実体にアクセスするようになる。 コンパイラの最適化…

スレッドのロック

ロックオブジェクトには同期をとるスレッドから参照した時に一意となるオブジェクトを指定する。 値型を指定した場合にはボックス化が行われて、各スレッドが別オブジェクトを参照することになる。 その為、ロックは行われない。thisオブジェクトを指定した…

スレッドの終了確認

Thread.Join()を使用する。 呼び出しもとスレッドを対象スレッドが終了するまでブロックする。 GUIプログラムでこれを呼び出すと、固まってしまうので注意すること。 そこで下記の用にして対応した。 while(thread.IsAlived()) { Application.DoEvents; }

スレッドの優先順位

ThreadクラスのPriorityプロパティにて設定。 startメソッド前に設定すること。 実際にサンプルを動かしてみたが 優先順位を上げたからといって、そんなに変わるものでは無かった。