1

我实际上有2个问题,这是第一个。

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

它会工作吗?

#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

还有第二个问题。在这里浏览时,我注意到作者没有包括

::初始化、删除、输入、离开临界区。这些不是班级正常工作所必需的吗?还是我错过了什么?

4

2 回答 2

2

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

Initialize并由类的构造函数和析构函数Delete调用。CriticalSection

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

于 2011-10-06T18:16:32.127 回答
2

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

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

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

于 2011-10-06T18:17:39.717 回答