这段代码是一个有用的关键部分包装类

时间:2011-10-06 18:05:43

标签: c++ windows api critical-section

我实际上有两个问题,第一个问题。

使用我在两个不同站点找到的代码,我编写了这两个关键部分包装类。

它会起作用吗?

#ifndef CRITICALSECTION_H
#define CRITICALSECTION_H
#include "windows.h"



class CriticalSection{
    long m_nLockCount;
    long m_nThreadId;
    typedef CRITICAL_SECTION cs;
    cs m_tCS;
public:
    CriticalSection(){
        ::InitializeCriticalSection(&m_tCS);
        m_nLockCount = 0;
        m_nThreadId = 0;
    }
    ~CriticalSection(){ ::DeleteCriticalSection(&m_tCS); }
    void Enter(){ ::EnterCriticalSection(&m_tCS);  }
    void Leave(){  ::LeaveCriticalSection(&m_tCS); }
    void Try();
};


class LockSection{
    CriticalSection* m_pCS;
public:
    LockSection(CriticalSection* pCS){
        m_pCS = pCS;
        if(m_pCS)m_pCS->Enter();
    }
    ~LockSection(){
        if(m_pCS)m_pCS->Leave();
    }
}

/*

Safe class basic structure;

class SafeObj
{
     CriticalSection m_cs;

public:
    void SafeMethod()
    {
        LockSection myLock(&m_cs);
        //add code to implement the method ...

    }
};



*/
#endif

第二个问题。在浏览 here 时,我注意到作者没有包含

::初始化,删除,回车,离开关键部分。这些课程是否需要正常工作?或者我错过了什么?

2 个答案:

答案 0 :(得分:2)

LockSection班级使用RAII来呼叫EnterLeave。创建对象时,将调用Enter。当对象被销毁时(通过超出范围),将调用Leave

InitializeDeleteCriticalSection类'构造函数和析构函数调用。

学习RAII,好好学习。这是你的朋友。

答案 1 :(得分:2)

我会回答第一个问题。第二个问题涉及不同站点的代码,您应该一次只询问一个问题。也许其他人会回答第二个问题。

您提供的代码可以正常使用。成员m_nLockCountm_nThreadId未使用且不需要。 Try()方法没有实现,但您可以删除它

如果未分配m_pCS,我个人会提出异常。这是一个明显的错误条件。默默地继续并假装资源受到保护是一个明显的危险。