关键代码段,也称为临界区,工作在用户方式下。它是指一个小代码段,在代码能执行前,它必须独占对某些资源的访问权。
在 MFC 中使用
- 在头文件中首先构造一个
CRTICAL_SECTION
类型的结构体 g_cs,并用 extern 关键字声明;进而在源文件中定义。 - 在类的构造函数中,调用
InitializeCriticalSection(&g_cs);
创建临界区对象代码段。 - 在类的析构函数中,调用
DeleteCriticalSection(&g_cs);
销毁临界区对象代码段。 - 在所需保护的代码前面调用
EnterCriticalSection(&g_cs);
获取临界区对象拥有权,如果获取到,则执行下面的代码,否则线程在这里一直等待。
5.在程序访问完保护的代码后,调用LeaveCriticalSection(&g_cs);
释放临界区对象拥有权,这时其他线程才可以进入步骤4。
注意事项
由于是在类的构造和析构函数中创建和销毁临界区对象,所以创建该类对象时,就激活关键代码段判断;而该类对象销毁时,比如在某个函数内部声明该类对象,那么这个函数结束时,该类对象也就销毁了,这时关键代码段也失效,如果线程执行时还遇到 EnterCriticalSection(&g_cs);
就会发生错误。
用例之一
函数B需要对 函数A中的执行结果进行处理,这时需要A执行完成,B在继续处理,周而反复。
void A()
{
EnterCriticalSection(&g_cs);
//需执行的代码
LeaveCriticalSection(&g_cs);
}
void B()
{
EnterCriticalSection(&g_cs);
//对A执行的代码做处理
LeaveCriticalSection(&g_cs);
}