CCriticalSection的使用(二)

2012-12-06 13:47:44 · 作者: · 浏览: 552

 

    这个值以秒为单位,他的默认值为2592000秒,大约30天.

    8、同一个线程可以随便进入用一个关键段N次,也就是说同一个线程调用EnterCriticalSection无论几次都会返回.不同线程是否能够进入关键段,要看EnterCriticalSection的参数(CRITICAL_SECTION结构的地址)之前是否有线程进入过.要记住:飞机上的卫生间有多个,你可以随便进入无人的卫生间,不能进入有人的卫生间.

    弄明白了CRITICAL_SECTION之后,使用CCriticalSection非常方便,如虎添翼.看代码:

    //头文件

    [cpp]

    class CCriticalSection : public CSyncObjet

    {...

    public:

    CRITICAL_SECTION m_sect;

    public:

    BOOL Unlock();

    BOOL Lock();

    BOOL Lock(DWORD dwTimeout);

    ...

    }

    [cpp]

    <p>//构造函数</p><p></p>CCriticalSection::CCriticalSection() : CSyncObject(NULL)

    {

    HRESULT hr = S_OK;

    if (!InitializeCriticalSectionAndSpinCount(&m_sect, 0))//可以理解为InitializeCriticalSection,为了效率,加了一个旋转锁.

    {

    hr =  HRESULT_FROM_WIN32(GetLastError());

    }

    if (FAILED(hr))

    {

    AtlThrow(hr);

    }

    }

    //进入关键段

    [cpp]

    BOOL CCriticalSection::Lock()

    {

    ::EnterCriticalSection(&m_sect);

    return TRUE;

    }

    // 离开关键段

    [cpp]

    BOOL CCriticalSection::Unlock()

    {

    ::LeaveCriticalSection(&m_sect);

    return TRUE;

    }

    // 析构

    [cpp]

    CCriticalSection::~CCriticalSection()

    {

    ::DeleteCriticalSection(&m_sect);

    }