2011-02-10 87 views
4

这段代码差异性之探源:CCriticalSection做什么?

::EnterCriticalSection(&m_CriticalSection); 
//... 
::LeaveCriticalSection(&m_CriticalSection); 

,代码:

static CCriticalSection cs; 
cs.Lock(); 
//... 
cs.UnLock(); 

回答

8

没有区别落到实处。 CCriticalSection是唯一的合成糖前者。它内部使用EnterCriticalSectionLeaveCriticalSection!

EnterCriticalSectionLeaveCriticalSection是低级别的Win32 API,而CCriticalSection是MFC类它包装这些功能。它有一个由API使用的类型为CRITICAL_SECTION的成员数据。

MSDN说,

的 CCriticalSection类的功能由 实际的Win32 CRITICAL_SECTION 对象提供。

2

它封装CRITICAL_SECTION结构和四个运算 - InitializeCriticalSection()EnterCriticalSection()LeaveCriticalSection()DeleteCriticalSection()成一个类使其更方便地编写代码。

7

如果以这种方式使用,则没有区别。对类的主要好处是,如果你使用它,如下所示:

static CCriticalSection cs; 
{ 
    CSingleLock lock(cs, true); 
    // do your work here 
} // unlocked automatically 

当范围退出关键部分将被解锁,即使抛出了一个异常或使用早期的回报。该技术被称为RAII(资源获取初始化)并且广为人知。

MFC同步类的设计不是很好。如果你能掌握它们,我会推荐使用boost.thread或者新的C++标准。

+0

据我了解的文档,这将无法正常工作,因为`CSingleLock`构造函数只会尝试锁定资源,如果您通过提供TRUE作为第二个参数来专门询问它的话。否则,你仍然需要手动调用`lock.Lock()`。 `cs.IsLocked()`似乎并不存在,你可能意味着`lock.IsLocked()`。无论哪种情况,该检查可能不是必需的,因为`CCriticalSection.Lock()`不会失败。至少,这是我从文档中获得的。 – Medo42 2012-10-04 10:00:58