临界区块






2.40/5 (10投票s)
使用 CRITICAL_SECTION 的辅助类
引言
通常,更多的线程意味着更多的临界区。因此,在 Windows 编程中,我们使用 CRITICAL_SECTION
变量和相关函数。临界区块可以提高代码的可读性并防止可能发生的错误。
背景
保护临界区最简单的方法就是在该区域使用 CRITICAL_SECTION
变量,并配合 EnterCriticalSection()
和 LeaveCriticalSection()
函数。但这很繁琐,而且如果我们不够小心,甚至可能导致死锁。因此,我们有些人会编写一个类似于 auto_ptr
的类。
class AutoCriticalSection
{
public:
AutoCriticalSection(CRITICAL_SECTION* pCS)
: m_pCS(pCS)
{
EnterCriticalSection(m_pCS);
}
~AutoCriticalSection()
{
LeaveCriticalSection(m_pCS);
}
private:
CRITICAL_SECTION* m_pCS;
};
AutoCriticalSection
类值得使用。但是,请考虑以下情况。如果临界区非常小,并且需要将其缩小,我们应该编写一个如下所示的新块
// Now you limit protected range as you want.
{
AutoCriticalSection(&cs) myAutoCS;
// Manipulate some shared data here.
}
我认为这段代码很丑陋,并决定使用另一种方法。其结果就是临界区块。
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)
临界区块的关键部分是运算符 bool()
和使用 if
语句的 define
。 这段代码非常简单,但也很实用。
Using the Code
使用起来非常简单!
CSBLOCK(&cs)
{
// Manipulate some shared data here.
}
也很容易理解。
历史
- 2008年10月14日:初始发布