Re: Are CCriticalSection and CMutex the same in one process?
On Tue, 17 Mar 2009 11:49:02 -0700, WJ <WJ@discussions.microsoft.com>
wrote:
If I use CSingleLock with CCriticalSection or CMutex in ONE process to lock
the resource for thread-safety, will the effect the same? Thanks.
I undarstand that CMutex can be used across process boundaries.
As they both implement the mutex concept, the effect will be the same, but
the performance may not be. A Windows MUTEX (my caps) is a kernel object
represented by a HANDLE, and operations on it always require a kernel
transition. OTOH, a Windows CRITICAL_SECTION is sort of a mix between user
and kernel space objects. When there is no contention, acquiring a
CRITICAL_SECTION does not involve a kernel transition; however, waiting on
a locked CRITICAL_SECTION does. So acquiring an uncontended
CRITICAL_SECTION is faster than acquiring an uncontended MUTEX, but it is
definitely not free. For example, several years ago I measured the speed of
a tight fgetc loop, and I found the thread-safe forms of functions like
fgetc can be 10x slower than the thread-unsafe forms. I concluded this was
due to uncontended CRITICAL_SECTION locking. (MS has provided "nolock"
forms of stdio functions to help deal with this.) Will it matter? Maybe,
maybe not. As with all performance considerations, it depends completely on
what the code is doing in the overall context of the program that is
running it.
That said, CRITICAL_SECTION should be the default choice for a mutex. You
would use a MUTEX if you needed to do a timed wait, you needed to use it
with WaitForMultipleObjects, or you needed the interprocess capability you
mentioned.
--
Doug Harrison
Visual C++ MVP