这段代码差异性之探源:CCriticalSection做什么?
::EnterCriticalSection(&m_CriticalSection);
//...
::LeaveCriticalSection(&m_CriticalSection);
,代码:
static CCriticalSection cs;
cs.Lock();
//...
cs.UnLock();
这段代码差异性之探源:CCriticalSection做什么?
::EnterCriticalSection(&m_CriticalSection);
//...
::LeaveCriticalSection(&m_CriticalSection);
,代码:
static CCriticalSection cs;
cs.Lock();
//...
cs.UnLock();
没有区别落到实处。 CCriticalSection
是唯一的合成糖前者。它内部使用EnterCriticalSection
和LeaveCriticalSection!
EnterCriticalSection
和LeaveCriticalSection
是低级别的Win32 API,而CCriticalSection
是MFC类它包装这些功能。它有一个由API使用的类型为CRITICAL_SECTION
的成员数据。
MSDN说,
的 CCriticalSection类的功能由 实际的Win32 CRITICAL_SECTION 对象提供。
它封装CRITICAL_SECTION
结构和四个运算 - InitializeCriticalSection()
,EnterCriticalSection()
,LeaveCriticalSection()
和DeleteCriticalSection()
成一个类使其更方便地编写代码。
如果以这种方式使用,则没有区别。对类的主要好处是,如果你使用它,如下所示:
static CCriticalSection cs;
{
CSingleLock lock(cs, true);
// do your work here
} // unlocked automatically
当范围退出关键部分将被解锁,即使抛出了一个异常或使用早期的回报。该技术被称为RAII(资源获取初始化)并且广为人知。
MFC同步类的设计不是很好。如果你能掌握它们,我会推荐使用boost.thread或者新的C++标准。
据我了解的文档,这将无法正常工作,因为`CSingleLock`构造函数只会尝试锁定资源,如果您通过提供TRUE作为第二个参数来专门询问它的话。否则,你仍然需要手动调用`lock.Lock()`。 `cs.IsLocked()`似乎并不存在,你可能意味着`lock.IsLocked()`。无论哪种情况,该检查可能不是必需的,因为`CCriticalSection.Lock()`不会失败。至少,这是我从文档中获得的。 – Medo42 2012-10-04 10:00:58