Hatena::ブログ(Diary)

現代プログラマの朝焼け

2008-07-06 今日は LINQ 勉強会 第3回

lock ステートメント

C# の lock ステートメントは System.Threading.Monitor クラスの Enter(object)/Exsit(object) メソッドと try - finally ステートメントに展開される。


lock(requestQueue)
{
	requestQueue.Enqueue("WorkItem");
}

は展開されると以下のようになる。

Monitor.Enter(requestQueue);
try
{
	requestQueue.Enqueue("WorkItem");
}
finally
{
	Monitor.Exit(requestQueue);
}

ちなみに MSDN の Monitor.Exit(object) メソッドに気になる記述が。。。

ロックが解放されて、他のスレッドオブジェクトの実行待ちキューに入ると、それらのスレッドの 1 つがロックを取得します。ロックを取得するために待機キュー内で待機している他のスレッドは、ロックの所有者が Exit を呼び出しても、実行待ちキューに自動で移動しません。1 つ以上の待機中のスレッドを実行待ちキューに移動するには、Exit を呼び出す前に、Pulse または PulseAll を呼び出します。

What's? マジですか?

今抱えている問題もどうやらあたりが原因で起きているのかも。。。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/chegue/20080706/1215313067