在 MFC(Microsoft Foundation Classes)中,CCriticalSection 类用于实现临界区(Critical Section),以确保多线程操作时的同步性。CCriticalSection 类的构造函数通常不是公共的,而是通过公共函数 CCriticalSection::CCriticalSection 来创建临界区对象。在初始化临界区对象时,可以选择传递参数来指定初始化参数,如临界区的调试信息。

以下是一个典型的 CCriticalSection 对象的创建示例:
#include <afxmt.h>

// ...

CCriticalSection g_criticalSection; // 全局临界区对象

// ...

// 在某个函数或代码块中使用临界区
void SomeFunction()
{
    // ...

    g_criticalSection.Lock(); // 进入临界区

    // 在这里执行需要同步的操作

    g_criticalSection.Unlock(); // 离开临界区

    // ...
}

在这个例子中,g_criticalSection 是一个全局的 CCriticalSection 对象,通过调用 Lock 进入临界区,执行需要同步的操作,然后通过调用 Unlock 离开临界区。

请注意,为了确保在离开临界区时总是调用 Unlock,通常使用 C++ 的 RAII(Resource Acquisition Is Initialization)原则,可以使用 CAutoLock 对象来自动管理临界区:
#include <afxmt.h>

// ...

CCriticalSection g_criticalSection; // 全局临界区对象

// ...

// 在某个函数或代码块中使用临界区
void SomeFunction()
{
    // ...

    CAutoLock lock(&g_criticalSection); // 进入临界区,离开临界区时会自动调用 Unlock

    // 在这里执行需要同步的操作

    // 不需要显式调用 Unlock

    // ...
}

CAutoLock 的构造函数会在创建时自动调用 Lock 进入临界区,而在对象离开作用域时,会自动调用 Unlock 离开临界区。这样可以更安全地管理临界区的使用。


转载请注明出处:http://www.zyzy.cn/article/detail/16095/MFC/CCriticalSection