CCriticalSectionEx v1.06
Welcome to CCriticalSeciontEx,
a drop in replacement for the MFC class CCriticalSection which provides a MFC
critical section with timeouts and spint counts. The
code is based on the code presented in Chapter Ten of the book "Programming
Applications for Microsoft Windows" by Jeffrey Richter.
Features
- Simple and clean C++ interface.
- The code is Unicode enabled and build configurations are provided.
- The classes integrate closely with MFC. i.e. instead of the CResGuard
class we use the class "CCriticalSectionEx". This class implements timeouts and spin counts compared to the
standard MFC CCriticalSection class.
Copyright
- You are allowed to include the source code in any product (commercial, shareware,
freeware or otherwise) when your product is released in binary form.
- You are allowed to modify the source code in any way you want except you
cannot modify the copyright details at the top of each module.
- If you want to distribute source code with your application, then you are
only allowed to distribute versions released by the author. This is to maintain
a single distribution point for the source code.
Usage
- To use the classes in your project simply include TSafe.h and / or
CriticalSectionEx.h from the test application
in your application. Then simply create an instance of whichever class you want.
- Please note that the classes have been MFC'ified (compared to the Richter
code) and also have a number of bug fixes and additions over and above the classes
presented in the book.
- As of v1.05 the class is now designed for VC 2017 or later.
It will not compile on earlier releases of VC.
- To see the code in action, have a look at the code in the sample app in
the function "CTSafeTestApp::InitInstance" in the module "TSafeTest.cpp".
History
v1.06 (12 March 2020)
- Updated copyright details.
- Fixed various Clang-Tidy static code analysis warnings in the code.
v1.05 (8 December 2018)
- Updated copyright details.
- Removed deprecated TSafe.h from download
v1.04 (17 January 2016)
- Updated copyright details.
- Verified the code compiles cleanly in VC 2015
- Added SAL annotations to all the code
- The CCriticalSectionEx class has been moved to its own module of
CriticalSectionEx.h
- You should consider the "CThreadSafe" and "CThreadSafeScalar" classes
deprecated as there is now equivalent support in the STL C++ runtime via the
"atomic" header file.
v1.03 (5 April 2015)
- Updated copyright details.
- Updated the sample app and code to clean compile in VC 2010 and later.
- The code now statically references
InitializeCriticalSectionAndSpinCount, TryEnterCriticalSection &
SetCriticalSectionSpinCount rather than by using GetProcAddress.
- Removed the SpinCountsAvailable, TimeoutsAvailable & NumberOfProcessors
methods as we are not using GetProcAddress anymore.
- Removed the m_bLocked member variable.
v1.02 (11 January 2009)
- Updated copyright details
- Removed VC 6 style AppWizard comments from the code
- The code has now been updated to support VC 2005 or later only. It seems
that even though ATL's version of CCriticalSection now supports spin locks
the MFC version of CCriticalSection still does not support them, hence still
the need for CCriticalSectionEx.
- Fixed a bug in CCriticalSectionEx::Lock where it handled the wrong SEH
type being thrown. The code now only handles the STATUS_NO_MEMORY exception
- Code now compiles cleanly using Code Analysis (/analyze)
- Removed the bPreallocateEvent parameter from the
CCriticalSectionEx::Init and CCriticalSectionEx's overridden constructor.
- Removed the call to Unlock in the CCriticalSectionEx destructor. This is
to be consistent with MFC's CCriticalSection class.
- CCriticalSectionEx::Lock now throws a CMemoryException* exception. This
is to be consistent with MFC's CCriticalSection class.
- The m_bLocked member variable of CCriticalSectionEx is now a bool
instead of a BOOL. The IsLocked method has also been updated to return a
bool.
v1.01 (22 December 2006)
- Updated copyright details
- Optimized CThreadSafe constructor code
- Code now uses newer C++ style casts instead of C style casts.
- Updated the code to clean compile on VC 2005
- Made CCriticalSectionEx::Lock and Unlock non virtual
- Optimized _CRITICAL_SECTION_DATA constructor code
- CCriticalSectionEx constructors now throws an exception using
AfxThrowMemoryException instead of AfxThrowResourceException
- Removed unnecessary CThreadSafe destructor
- Removed unnecessary CThreadSafeScalar destructor
- Added postfix operator support to CThreadSafeScalar
- Addition of a operator TYPE*() in CThreadSafe
- m_Value member variable of CThreadSafe is now public
- Addition of a CCRITICALSECTIONEX_EXT_CLASS preprocessor macro to allow
the classes to be more easily added to an extension dll
v1.0 (4 December 2002)
Contacting the Author
PJ Naughter
Email: pjna@naughter.com
Web: http://www.naughter.com
12 March 2020