Introduction
More threads make more critical sections usually. For that, in Windows programming, we use CRITICAL_SECTION
variable and related functions. Critical Section Block increases code-readability and prevents errors that could possibly happen.
Background
The simplest way protecting critical section is just using CRITICAL_SECTION
variables with EnterCriticalSection()
and LeaveCriticalSection()
on that area. But it is tedious work and even has the risk of deadlock if we do not really care. So, some of us write an auto_ptr
-like class.
class AutoCriticalSection
{
public:
AutoCriticalSection(CRITICAL_SECTION* pCS)
: m_pCS(pCS)
{
EnterCriticalSection(m_pCS);
}
~AutoCriticalSection()
{
LeaveCriticalSection(m_pCS);
}
private:
CRITICAL_SECTION* m_pCS;
};
AutoCriticalSection
class is worth using. But, think of this. If the critical section is pretty small and it's needed to it make narrow, we should write a new block like the one shown below:
{
AutoCriticalSection(&cs) myAutoCS;
}
I thought the code is pretty ugly and decided to use another method. Its result is Critical Section Block.
class CriticalSectionContainer
{
public:
CriticalSectionContainer(CRITICAL_SECTION* pCS)
: m_pCS(pCS)
{
EnterCriticalSection(m_pCS);
}
~CriticalSectionContainer()
{
LeaveCriticalSection(m_pCS);
}
operator bool()
{
return true;
}
private:
CRITICAL_SECTION* m_pCS;
};
#define CSBLOCK(x) if (CriticalSectionContainer __csc = x)
Critical parts of Critical Section Block are operator bool()
and define
using if
-statement. It’s very simple code but also very useful.
Using the Code
It’s really simple using it!
CSBLOCK(&cs)
{
}
It's also easy to understand.
History
- 14th October, 2008: Initial post