65.9K
CodeProject 正在变化。 阅读更多。
Home

临界区块

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.40/5 (10投票s)

2008年10月14日

CPOL
viewsIcon

26022

downloadIcon

242

使用 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日:初始发布
© . All rights reserved.