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
类。 它还有Lock
和Unlock
方法,但如果发生异常,你不必担心解锁资源的问题。嵌入方法 还可以通过将
CCriticalSection
类型的数据成员添加到类并在需要时锁定数据成员来与多个线程共享该类。
有关使用 CCriticalSection
对象的详细信息,请参阅多线程:如何使用同步类一文。
继承层次结构
CCriticalSection
要求
标头:afxmt.h
CCriticalSection::CCriticalSection
构造 CCriticalSection
对象。
CCriticalSection();
备注
若要访问或释放 CCriticalSection
对象,请创建一个 CSingleLock
对象并调用其 Lock
和 Unlock
成员函数。 如果以独立方式使用 CCriticalSection
对象,请调用其 Unlock
成员函数以释放它。
如果构造函数无法分配所需的系统内存,则会自动引发 CMemoryException
类型的内存异常。
示例
查看 CCriticalSection::Lock 的示例。
CCriticalSection::Lock
调用此成员函数以获取关键部分对象的访问权限。
BOOL Lock();
BOOL Lock(DWORD dwTimeout);
参数
dwTimeout
Lock
将忽略此参数值。
返回值
如果该函数成功,则为非零;否则为 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
的示例。