Subscribed unsubscribe Subscribe Subscribe

The dawn of modern programmers

現代プログラマーの朝焼け

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? マジですか?
今抱えている問題もどうやらあたりが原因で起きているのかも。。。