此代码之间有什么区别:
::EnterCriticalSection( &m_CriticalSection );
//...
::LeaveCriticalSection( &m_CriticalSection );
和代码:
static CCriticalSection cs;
cs.Lock();
//...
cs.UnLock();
答案 0 :(得分:9)
实际上没有区别。 CCriticalSection
是前者唯一的合成糖。 内部使用EnterCriticalSection
和LeaveCriticalSection!
EnterCriticalSection
和LeaveCriticalSection
是低级别的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()
封装到一个类中,使代码编写更方便