CCriticalSection

表示一个“关键部分”- 一次支持一个线程访问资源或代码段的同步对象。

语法

class CCriticalSection : public CSyncObject

成员

公共构造函数

名称 描述
CCriticalSection::CCriticalSection 构造 CCriticalSection 对象。

公共方法

名称 描述
CCriticalSection::Lock 用于获取对 CCriticalSection 对象的访问权限。
CCriticalSection::Unlock 释放 CCriticalSection 对象。

公共运算符

“属性” 描述
CCriticalSection::operator CRITICAL_SECTION* 检索指向内部 CRITICAL_SECTION 对象的指针。

公共数据成员

“属性” 描述
CCriticalSection::m_sect CRITICAL_SECTION 对象。

备注

当一次只允许一个线程修改数据或其他一些受控资源时,关键部分非常有用。 例如,将节点添加到链接列表就是一次只允许一个线程的进程。 通过使用 CCriticalSection 对象来控制链接列表,一次只有一个线程可以访问该列表。

注意

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

在速度至关重要并且不会跨进程边界使用资源时,将使用关键部分而不是互斥体(请参阅 CMutex)。

可通过两种方法使用 CCriticalSection 对象:独立和嵌入类中。

  • 独立方法 若要使用独立 CCriticalSection 对象,请根据需要构造 CCriticalSection 对象。 从构造函数成功返回后,通过调用 Lock 显式锁定对象。 访问关键部分后,调用 Unlock。 此方法虽然对读取源代码的用户更清晰,但更容易出错,因为必须记住在访问之前和之后锁定和解锁关键部分。

    更可取的方法是使用 CSingleLock 类。 它还有 LockUnlock 方法,但如果发生异常,你不必担心解锁资源的问题。

  • 嵌入方法 还可以通过将 CCriticalSection 类型的数据成员添加到类并在需要时锁定数据成员来与多个线程共享该类。

有关使用 CCriticalSection 对象的详细信息,请参阅多线程:如何使用同步类一文。

继承层次结构

CObject

CSyncObject

CCriticalSection

要求

标头afxmt.h

CCriticalSection::CCriticalSection

构造 CCriticalSection 对象。

CCriticalSection();

备注

若要访问或释放 CCriticalSection 对象,请创建一个 CSingleLock 对象并调用其 LockUnlock 成员函数。 如果以独立方式使用 CCriticalSection 对象,请调用其 Unlock 成员函数以释放它。

如果构造函数无法分配所需的系统内存,则会自动引发 CMemoryException 类型的内存异常。

示例

查看 CCriticalSection::Lock 的示例。

CCriticalSection::Lock

调用此成员函数以获取关键部分对象的访问权限。

BOOL Lock();
BOOL Lock(DWORD dwTimeout);

参数

dwTimeoutLock 将忽略此参数值。

返回值

如果该函数成功,则为非零;否则为 0。

备注

Lock 是一个阻塞性调用,在关键部分对象发出信号(变为可用)后才会返回。

如果需要计时等待,可以使用 CMutex 对象,而不是 CCriticalSection 对象。

如果 Lock 构造函数无法分配所需的系统内存,则会自动引发 CMemoryException 类型的内存异常。

示例

此示例通过控制对使用共享 CCriticalSection 对象的共享资源(静态 _strShared 对象)的访问来演示嵌套的关键部分方法。 SomeMethod 函数演示如何以安全方式更新共享资源。

//Definition of critical section class
class CMyCritSectClass
{
   static CString _strShared; //shared resource
   static CCriticalSection _critSect;

public:
   CMyCritSectClass(void) {}
   ~CMyCritSectClass(void) {}
   void SomeMethod(void); //locks, modifies, and unlocks shared resource
};

//Declaration of static members and SomeMethod
CString CMyCritSectClass::_strShared;
CCriticalSection CMyCritSectClass::_critSect;

void CMyCritSectClass::SomeMethod()
{
   _critSect.Lock();
   if (_strShared == "")
      _strShared = "<text>";
   _critSect.Unlock();
}

CCriticalSection::m_sect

包含所有 CCriticalSection 方法使用的临界区对象。

CRITICAL_SECTION m_sect;

CCriticalSection::operator CRITICAL_SECTION*

检索 CRITICAL_SECTION 对象。

operator CRITICAL_SECTION*();

备注

调用此函数以检索指向内部 CRITICAL_SECTION 对象的指针。

CCriticalSection::Unlock

释放 CCriticalSection 对象以供另一个线程使用。

BOOL Unlock();

返回值

如果 CCriticalSection 对象由线程拥有且释放成功,则为非零;否则为 0。

注解

如果正在以独立方式使用 CCriticalSection,则必须在使用完关键部分控制的资源后立即调用 Unlock。 如果正在使用 CSingleLock 对象,则由锁定对象的 Unlock 成员函数调用 CCriticalSection::Unlock

示例

请参阅 CCriticalSection::Lock 的示例。

另请参阅

CSyncObject
层次结构图
CMutex