Re: CMultiLock example
On Sun, 16 Aug 2009 11:57:09 +0100, Stephen Wolstenholme
<steve@tropheus.demon.co.uk> wrote:
Thanks, that's a useful example. I am currently using a CSingleLock
with CMutex to prevent problems with link lists within the thread. The
trouble is that there is a performance problem locking the whole
thread. There are multiple link lists modified within the thread. I
should be able to use CMultiLock to lock a different CMutex for each
list.
A couple of things. For synchronization within a single process, using the
windows lightweight mutex, i.e. CRITICAL_SECTION, is preferable, but even
though using MFC's CCriticalSection with CMultiLock compiles fine, it blows
up at run-time. This is because CRITICAL_SECTION is not referenced with a
HANDLE, which is required for the WaitForMultipleObjects function which
underlies CMultiLock, yet CCriticalSection derives from CSyncObject, just
like CMutex. That's one of the many design flaws in the MFC sync classes.
Another is that CSingleLock by default does not acquire the lock! You have
to always remember to specify "true" for its ctor to get the default
behavior of every other lock class that's ever been written. Reading the
documentation for CMultiLock's ctor, I have no idea what it does WRT WFMO's
wait-all and timeout parameters. This is just scratching the surface; MFC's
sync classes are really bad. I believe some people say ATL has better
classes for this.
Getting back to the CRITICAL_SECTION usage and the impossibility of using
it with WFMO, I have to wonder if you can't approach your problem in a
different way. If you really do need to protect access to multiple lists at
the same time, you can lock them individually in series. Just be sure to do
it the same order and release them in reverse order in all your threads.
This is necessary to avoid deadlock. This avoids WFMO and will allow you to
use the more efficient CRITICAL_SECTION. Of course, if you're doing this
every time you access the lists, what you really need is a single mutex to
guard them all. Whatever the case, the access protocol has to be consistent
and make sense from a bird's eye view of all the threads that use the
lists.
--
Doug Harrison
Visual C++ MVP