CCriticalSection做什么?

时间:2011-02-10 07:12:53

标签: c++ winapi

此代码之间有什么区别:

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

和代码:

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

3 个答案:

答案 0 :(得分:9)

实际上没有区别。 CCriticalSection是前者唯一的合成糖。 内部使用EnterCriticalSectionLeaveCriticalSection!

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

MSDN说,

  

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

答案 1 :(得分:7)

如果你这样使用它,没有区别。该课程的主要好处是如果您按如下方式使用它:

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

当退出范围时,即使抛出异常或使用了早期返回,临界区也将被解锁。该技术称为RAII(资源获取是初始化),并且广为人知。

MFC同步类设计不合理。我建议使用boost.thread或者新C ++标准中提供的那些,如果你可以得到它们。

答案 2 :(得分:2)

它将CRITICAL_SECTION结构和四个操作 - InitializeCriticalSection()EnterCriticalSection()LeaveCriticalSection()DeleteCriticalSection()封装到一个类中,使代码编写更方便