二、高级线程同步
如果线程访问共享资源或者等待一些特殊事件的发生,如果共享资源可用或特殊事件已发生则函数返回同时该进程保持可调度状态,否则该线程处于等待状态。系统将处于等待状态的线程不占用系统资源(不浪费CPU时间),当资源可用或特殊事件发生时将线程处于可调度状态,该线程与资源或特殊事件保持同步。
应该避免一个线程(通过不断查询多个线程共享或可以访问的变量的状态)与另一个线程中的任务的完成实现同步
三、关键代码段
关键代码段(又叫临界区),即通过一小段代码使进程对共享资源以独占的方式进行访问,让该段代码能以原子操作的方式访问共享资源的一种方法。通过CRITICAL_SECTION结构(临界对象)实现互斥。关键代码的主要缺点是无法用它们对多个进程中的各个线程进行同步。
- 关键代码段描述
关键代码段实现步骤
1)InitializeCriticalSection 初始化临界代码段
2)EnterCriticalSention 临界代码段,拥有临界区对象所有权
3)LeaveCriticalSection 离开.....,放弃临界区对象所有权
4)DeleteCriticalSection 删除.....
VOID InitializeCriticalSection (PCRITICAL_SECTION pcs);
对(p c s指向的)CRITICAL_SECTION结构的各个成员进行初始化。
VOID EnterCriticalSection(PCRITICAL_SECTION pcs);
用于查看结果中的变量以确定临界资源是否可以以互斥的方式进行访问,如果没有别的线程互斥的访问该资源则更新变量,获得该资源的访问权。如果该资源正在被其他线程访问则将调用该函数的线程处于置于等待状态,一旦占有该资源的线程释放该资源就将调用线程置于可调度状态。
VOID LeaveCriticalSection(PCRITICAL_SECTION pcs);
查看该结构中的成员变量。该函数每次计数时要递减1,以指明调用线程多少次被赋予对共享资源的访问权。如果计数大于0,不做任何操作返回。如果计数为0,查看在调用EnterCriticalSention中是否有别的线程正在等待。如果有就更新成员变量,并使等待线程中的一个线程处于可调度状态。
VOID DeleteCriticalSection(PCRITICAL_SECTION pcs);
对(p c s指向的)CRITICAL_SECTION结构的各个成员进行删除。