【发布时间】:2011-12-16 02:12:10
【问题描述】:
我实际上有 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
还有第二个问题。浏览here时发现作者没有包含
::Initialize 、 Delete 、 Enter 、 Leave 临界区。这些不是班级正常工作所必需的吗?还是我错过了什么?
【问题讨论】:
-
这些函数在
XYCriticalSection类中。在您的代码中,SafeMethod应该是LockSection myLock(&m_cs); -
如果您要求对您的代码进行批评,请在此处发布:codereview.stackexchange.com
-
显示正常。 Initialize、Delete、Enter 和 Leave 函数在您发布的小示例中。不确定您认为缺少什么?
-
我会让
CriticalSection::Enter/Leave/Try受保护,friend LockSection,这样可以最大限度地减少错误。此外,CriticalSection应该有一个私有的未定义赋值运算符,LockSection应该有复制/赋值运算符。那么你就完全安全了。 -
感谢大家这么快回答!虽然第二个问题仍然存在,但为什么我上面提到的 codeproject 文章的作者没有使用 ::Initialize 、 ::Enver 、 ::Leave 等?
标签: c++ windows api critical-section