マルチスレッド

今日の反省

・スレッド間の同期取りは本当によく考えて、最小範囲のみに使用する。範囲が大きすぎる・使用箇所が多すぎると、スレッド処理をしているのに逐次処理と変わらなくなるよ。・設計が正しく行われているかのチェック方法。関係するクラスとやりとりされるデー…

ManualResetEvent

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

volatile(ボラタイル)

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

スレッドのロック

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

スレッドの終了確認

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

スレッドの優先順位

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

WorkerThreadから情報を送信する

デリゲート、イベントを使用してスレッド処理中の状態の変化を送信する。 class Worker { public delegate void ThreadProcessUnitCompleteEventHandler(int state); public event ThreadProcessUnitCompleteEventHandler eventHandler; private bool finish…