CCriticalSection做什么?

adi*_*dir 5 c++ winapi

这段代码之间的差异是什么:

::EnterCriticalSection( &m_CriticalSection );
//...
::LeaveCriticalSection( &m_CriticalSection );
Run Code Online (Sandbox Code Playgroud)

和代码:

static CCriticalSection cs;
cs.Lock();
//...
cs.UnLock();
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 9

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

EnterCriticalSection并且LeaveCriticalSection是低级别的win32 API,而它CCriticalSection是一个包含这些功能的MFC类.它具有CRITICAL_SECTIONAPI使用的类型的成员数据.

MSDN说,

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


yme*_*ett 7

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

static CCriticalSection cs;
{
  CSingleLock lock(cs, true);
  // do your work here
} // unlocked automatically
Run Code Online (Sandbox Code Playgroud)

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

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