多线程学习笔记 四 之 Critical Sections(关键区域、临界区域)
multithreading applications in Win32 P115
在 Win32程序中你可以为每一个需要保护的资源声明一个 CRITICAL_SECTION 类型的变量。这个变量
扮演红绿灯的角色,让同一时间内只有一个线程进入 critical section 。Critical Section 并不
是核心对象。你应该做的是将一个类型为 CRITICAL_SECTION 的局部变量初始化,方法是调用
InitializeCriticalSection();
VOID InitializeCriticalSection (
LPCRITICAL_SECTION lpCriticalSection );
参数说明:
lpCriticalSection 一个指针,指向预被初始化的 CRITICAL_SECTION 变量。这个变量应该在你的
程序中定义。
当你用毕 critical section 时,你必须调用 DeleteCriticalSection() 清除它。这个函数并没有
’释放对象‘的意义在里头,不要把它和 C++ 的 delete 运算符混淆了。
VOID DeleteCriticalSection (
LPCRITICAL_SECTION lpCriticalSection );
参数:
lpCriticalSection 指向一个不再需要的 CRITICAL_SECTION 变量。
示例:
CRITICAL_SECTION gCriticalSection;
void CreateDeleteCriticalSection()
{
InitializeCriticalSection(&gCriticalSection);
/*Do something here */
DeleteCriticalSection(&gCriticalSection);
}
一旦 critical section 被初始化,每一个线程就可以进入其中--只要它通过了
EnterCriticalSection() 这一关。
VOID EnterCriticalSection(
LPCRITICAL_SECTION lpCriticalSection );
参数说明:
lpCriticalSection 指向一个即将锁定的 CRITICAL_SECTION 变量。
当线程准备好离开 critical section 时,它必须调用 LeaveCriticalSection():
VOID LeaveCriticalSection (
LPCRITICAL_SECTION lpCriticalSection );
参数说明:
lpCriticalSection 指向一个你即将解除锁定的 CRITICAL_SECTION 变量。
示例:
void updateData()
{
EnterCriticalSection(&gCriticalSection);
/*updata the resource*/
LeaveCriticalSection(&gCriticalSection);
}
一个重要的警告:千万不要在一个 critical section 之中调用 Sleep() 或任何 Wait...()
API函数。
multithreading applications in Win32 P115
在 Win32程序中你可以为每一个需要保护的资源声明一个 CRITICAL_SECTION 类型的变量。这个变量
扮演红绿灯的角色,让同一时间内只有一个线程进入 critical section 。Critical Section 并不
是核心对象。你应该做的是将一个类型为 CRITICAL_SECTION 的局部变量初始化,方法是调用
InitializeCriticalSection();
VOID InitializeCriticalSection (
LPCRITICAL_SECTION lpCriticalSection );
参数说明:
lpCriticalSection 一个指针,指向预被初始化的 CRITICAL_SECTION 变量。这个变量应该在你的
程序中定义。
当你用毕 critical section 时,你必须调用 DeleteCriticalSection() 清除它。这个函数并没有
’释放对象‘的意义在里头,不要把它和 C++ 的 delete 运算符混淆了。
VOID DeleteCriticalSection (
LPCRITICAL_SECTION lpCriticalSection );
参数:
lpCriticalSection 指向一个不再需要的 CRITICAL_SECTION 变量。
示例:
CRITICAL_SECTION gCriticalSection;
void CreateDeleteCriticalSection()
{
InitializeCriticalSection(&gCriticalSection);
/*Do something here */
DeleteCriticalSection(&gCriticalSection);
}
一旦 critical section 被初始化,每一个线程就可以进入其中--只要它通过了
EnterCriticalSection() 这一关。
VOID EnterCriticalSection(
LPCRITICAL_SECTION lpCriticalSection );
参数说明:
lpCriticalSection 指向一个即将锁定的 CRITICAL_SECTION 变量。
当线程准备好离开 critical section 时,它必须调用 LeaveCriticalSection():
VOID LeaveCriticalSection (
LPCRITICAL_SECTION lpCriticalSection );
参数说明:
lpCriticalSection 指向一个你即将解除锁定的 CRITICAL_SECTION 变量。
示例:
void updateData()
{
EnterCriticalSection(&gCriticalSection);
/*updata the resource*/
LeaveCriticalSection(&gCriticalSection);
}
一个重要的警告:千万不要在一个 critical section 之中调用 Sleep() 或任何 Wait...()
API函数。