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 );
}
Carl Daniel [VC++ MVP] - 10 Nov 2006 21:59 GMT
> 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
[quoted text clipped - 4 lines]
> 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
Ian - 10 Nov 2006 22:12 GMT
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
Carl Daniel [VC++ MVP] - 10 Nov 2006 22:01 GMT
"Carl Daniel [VC++ MVP]" <cpdaniel_remove_this_and_nospam@mvps.org.nospam>
wrote in message news:...
>> 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
[quoted text clipped - 16 lines]
> // code that only needs resource 2
> }
Sorry - wrong language :)
To accomplish the same thing in C++/CLI, which lacks the lock keyword, you
have to use try/finally blocks to ensure that Monitor::Exit is called
exactly once.
-cd