【发布时间】:2011-03-24 15:14:06
【问题描述】:
给定以下代码,
class MyCriticalSection : protected CRITICAL_SECTION
{
public:
MyCriticalSection()
{
InitializeCriticalSection(this);
EnterCriticalSection(this);
}
~MyCriticalSection()
{
LeaveCriticalSection(this);
DeleteCriticalSection(this);
}
};
class MyClass
{
public:
MyClass() : m_Int(0) {}
int GetNum()
{
MyCriticalSection myCriticalSectionA; // LockA
return m_Int;
}
int SetNum(int i)
{
MyCriticalSection myCriticalSectionB; // LockB
m_Int = i;
}
protected:
int m_Int;
};
我假设以上设计是正确的,如果您发现一些错误,请纠正我。 LockA 的使用有两个功能: 1> 防止函数GetNum 被多个线程同时调用。 2> 防止GetNum和SetNum函数同时访问m_Int。
这是我的问题: 变量 myCriticalSectionA 和 myCriticalSectionB 是 MyCriticalSection 类的两个不同实例。为什么它们可以相互协作,使锁定机制按预期工作?
我的猜测是,不知何故 CRITICAL_SECTION 有一些静态标志,以便它的不同实例可以相互通信。
如果我错了,请纠正我。
==== 更新 ====
class MyCriticalSection : protected CRITICAL_SECTION
{
public:
MyCriticalSection()
{
InitializeCriticalSection(this);
}
~MyCriticalSection()
{
DeleteCriticalSection(this);
}
void Lock()
{
EnterCriticalSection(this);
}
void UnLock()
{
LeaveCriticalSection(this);
}
};
class MyClass
{
public:
MyClass() : m_Int(0) {}
int GetNum()
{
m_Lock.Lock();
// do something here
m_Lock.UnLock();
return m_Int;
}
int SetNum(int i)
{
m_Lock.Lock();
m_Int = i;
m_Lock.UnLock();
}
protected:
int m_Int;
MyCriticalSection m_Lock;
};
谢谢
【问题讨论】:
-
是什么让您认为这两个实例实际上是“协作”的(并且代码是正确的)?
-
@aix,我想我错误地假设这个关键部分与 Java 提供的同步方法相似。 -- 谢谢
标签: c++ winapi visual-c++