In concrete terms of .NET coding, if you call the WaitOne method on a thread, it may still process events that the CLR deems "high priority". This can be a big problem if the event handlers go into the critical region you are trying to protect.
int criticalRegion = 0;
private void criticalRegionWait()
{
AutoResetEvent are = new AutoResetEvent(false);
Thread thread = new Thread(() =>
{
criticalRegion = -1
Debug.WriteLine(criticalRegion);
are.Set();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
}
private void criticalRegionUpdateEvent(object sender, EventArgs e)
{
criticalRegion = 1;
}
In the above example, if there is a high priority event that has criticalRegionUpdateEvent in its call path a race condition is possible. While criticalRegionWait waits for the thread to finish, the criticalRegionUpdateEvent has a chance of setting criticalRegion = 1 so that WriteLine ends up printing 1 instead of -1.
No comments:
Post a Comment