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("終了");
}
}