マルチスレッド

マルチスレッド (C# によるプログラミング入門)
http://ufcpp.net/study/csharp/sp_thread.html
概要、マルチスレッドとは、C#におけるマルチスレッドプログラミング、排他制御C#における排他制御、lock文、volatile


C#ではThredクラスとデリゲートにより手軽にマルチスレッドプログラミングできる。
lock文を使ってスレッド間の同期をとる。


スレッドとは一連の処理の流れ。シングルスレッドに対し、マルチスレッドとは、複数の処理を並行して行う。
例 重い計算の最中にユーザからの入力が必要な場合など。


マルチスレッドを扱うには、System.Threading.Thread クラスを利用する。
メソッドをThreadStart デリゲートとしてThreadコンストラクタに渡し、Startメソッドでスレッドを開始する。
Joinメソッドでスレッドの終了を待つ。
System.Threading.ThreadStart
素因数分解の例


複数のスレッドが同一のデータに対しアクセスを要求することがある。そこで排他制御(exclusive operation)が必要になる。
同時に行えない処理が記述された部分を、クリティカルセクションという。


さて、オブジェクトに対し鍵をかけることで排他制御をするわけだが、この鍵をかけることを排他ロック(ロックの取得)といい、
鍵をかけられたオブジェクトのことを同期オブジェクトという。
鍵を外すことはアンロック(ロックの解放)という。


lock文の動作は、System.Threading.Monitorクラスが基となっている。
Monitorクラスの
Enter メソッド(クリティカルセクションに入ると言う意味)と
ロック解放のための Exit メソッド(クリティカルセクションから出る)
という2つの静的メソッドを使って排他ロックするぞ。

// EnterとExitだ!

object syncObject = new object();

Monitor.Enter(syncObject);
try
{
  クリティカルセクション
}
finally
{
  Monitor.Exit(syncObject);
}


これを踏まえて、lock文の解説だ。

lock(同期オブジェクト)
{
  クリティカルセクション
}

こう書くと、コンパイルがMonitorクラスを用いたコードを生成してくれる。


コンパイル時に不要に見える変数は削除されるが、
マルチスレッドプログラミングでは不要に見えても必要になる変数というのがよくあるらしい。
だから、必要だということを明示するために、volatile(揮発性)という修飾子を変数につけるそうだ!