Thread





thread


using System.Threading; // msec 単位で指定する Thread.Sleep( 1000 ); // BeginInvoke C# なら、Thread クラスとデリゲートで並行処理・並列処理もお手軽。 実際には、スレッドを直接作らず、スレッド プールを介して使う 排他処理は lock 文で ( 文という扱いらしい )



Thread.クラスを使う。


WARNING Threadクラスを使用して別スレッドで動作させることができるメソッドは 戻り値がvoidで、パラメータを取らないメソッドのみ POINT スタティックなメソッドは Win32 スレッドや pthread のように 汎用型をひとつとる メソッドを実行できる。
Thread.Start(); Thread.Start( Object );



Delegate.を使う


POINT  スレッドとして動作させたいメソッドと同じ引数を持つデリゲートを作成 BeginInvoke() を呼ぶ それだけでそのメソッドは別スレッドで実行される BeginInvoke で nullが2つ余計に指定されているのは、 スレッドの終了をチェックするためのもの C#では、スレッドの完了をチェックする仕組みまで言語レベルで提供される



Lock.する。(排他処理)


C# には lock 文と言う排他制御のための専用の構文がある。 lock 文は以下のようにして使う lock 文を使うと コンパイラが自動的に Monitor クラスを用いた排他制御用のコードを 生成してくれる。
lock( 同期オブジェクト ) { クリティカルセクション } // 鍵をかけてから処理をする。 // MISC ScopedLock も使えそう。 lock( syncObject ) { int tmp = num; Thread.Sleep(1); num = tmp + 1; }



Thread.間に同期をとる。


POINT Eventオブジェクトを使い、スレッド間で同期をとる。



有限のリソースにアクセスする。(空きがでるまで待つ。)





ThreadPool.スレッドプール


POINT スレッドプールを使うと自分でスレッドを生成しなくても システム側で勝手に順次処理を実行してくれる。
namespace System.Threading { public delegate void WaitCallback(object state); }
使う側
static void method( object o ); class Test { public void method( object o ); }



非同期メソッドの完了通知をうけとる。


POINT こちらから処理の終了をまったり、聞かないで 呼んでもらう。
class Program { public delegate int AsyncInvoke(); // 非同期で実行するメソッド static int Method1() { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); Console.WriteLine( "洗濯をします。" ); Thread.Sleep( 1000 ); return 0; } // 非同期の処理が完了したら呼んでもらう callback メソッド static void callback( IAsyncResult iret ) { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); Console.WriteLine( "おわったみたいだから、洗濯をほします。" ); } static void Main(string[] args) // aaa { Console.WriteLine("aaa"); AsyncCallback cb = callback; AsyncInvoke ai = Method1; Console.WriteLine(Thread.CurrentThread.ManagedThreadId); Console.WriteLine("洗濯をしといて、終わったら呼んでね。"); ai.BeginInvoke(cb, ai); // 非同期で実行したらまつ Thread.Sleep( 5000 ); Console.WriteLine("終了"); } }