how to check if Monitor::Exit has been called

  • Thread starter Thread starter Ian
  • Start date Start date
I

Ian

Monitor::Enter and Monitor::Exit must be called in pairs. Is there a way
to determine if Monitor::Exit has been called so that it does not get called
a second time? The psuedocode below illustrates a situation I would like
to implement. Essentially there are 2 monitors and the first monitor can be
released in 2 different locations. This sample codes uses a booleen
variable to make certain the first monitor is not released twice. My
question is, does .NET offer a better way to check if a monitor object has
already been released/exited?

Thanks,

Ian


Monitor::Enter( resource1.Object );
Monitor::Enter( resource2.Object );
bool bMonitor1IsActive = true;

try {
// ...uses resources locked by resource1.Object and resource2.Object ,
may throw exceptions...

Monitor::Exit( resource1.Object );
bMonitor1IsActive = false;

// ...excute code locked to resource2.Object , may throw exceptions...
}
catch( Exception ^pE ) {
// ... handle exception ...
}
finally {
if( bMonitor1IsActive )
Monitor::Exit( resource1.Object );
Monitor::Exit( resource2.Object );
}
 
Ian said:
Monitor::Enter and Monitor::Exit must be called in pairs. Is there a way
to determine if Monitor::Exit has been called so that it does not get
called a second time? The psuedocode below illustrates a situation I
would like to implement. Essentially there are 2 monitors and the first
monitor can be released in 2 different locations. This sample codes uses
a booleen variable to make certain the first monitor is not released
twice. My question is, does .NET offer a better way to check if a monitor
object has already been released/exited?

That's exactly what the lock keyword is for

lock (resource2)
{
lock(resource1)
{
// code that needs both
}

// code that only needs resource 2
}

-cd
 
Hello Carl,

Are you referring to the 'lock' class in the C++ support library? I just
found it in the online help and will take a look at it.

Thanks,

Ian
 
Back
Top