我实际上有两个问题,第一个问题。
使用我在两个不同站点找到的代码,我编写了这两个关键部分包装类。
它会起作用吗?
#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 时,我注意到作者没有包含
::初始化,删除,回车,离开关键部分。这些课程是否需要正常工作?或者我错过了什么?
答案 0 :(得分:2)
LockSection
班级使用RAII来呼叫Enter
和Leave
。创建对象时,将调用Enter
。当对象被销毁时(通过超出范围),将调用Leave
。
Initialize
和Delete
由CriticalSection
类'构造函数和析构函数调用。
学习RAII,好好学习。这是你的朋友。
答案 1 :(得分:2)
我会回答第一个问题。第二个问题涉及不同站点的代码,您应该一次只询问一个问题。也许其他人会回答第二个问题。
您提供的代码可以正常使用。成员m_nLockCount
和m_nThreadId
未使用且不需要。 Try()
方法没有实现,但您可以删除它
如果未分配m_pCS
,我个人会提出异常。这是一个明显的错误条件。默默地继续并假装资源受到保护是一个明显的危险。