用户模式下线程同步(一)

来源:互联网 发布:淘宝企业店铺名字大全 编辑:程序博客网 时间:2024/05/29 03:39

关键段(critical section)是一小段代码,他在执行之前需要独占对一些共享资源的访问权。 这段代码的执行可以理解为原子方式。

一、关键段结构
CRITICAL_SECTION

有个比喻很形象。一个CRITICAL_SECTION结构就像飞机上的一个卫生间,而马桶则是我们想要保护的数据。由于卫生间很小,因此在同一时刻只允许一个人(线程)在卫生间(关键段)内是使用马桶(被保护的资源)

二、常用函数
EnterCriticalSection
LeaveCriticalSection
InitializeCriticalSection
DeleteCriticalSection
TryEnterCriticalSection
InitializeCriticalSectionAndSpinCount

三、要点
1、在使用CRITICAL_SECTION的时候,两个必要条件。第一、使用关键段的线程必须知道CRITICAL_SECTION对象的地址;第二,在使用之前,CRITICAL_SECTION结构必须被初始化。
2、EnterCriticalSection和LeaveCriticalSection成对出现
3、TryEnterCriticalSection可以跳过关键段执行,返回为true时,才执行关键段,开始执行后必须调用LeaveCriticalSection结束;
4、如果线程因为关键段资源被占用,切换到等待状态,这意味着线程必须从用户模式切换到内核模式(大约1000个CPU周期),切换的开销非常大。所以可以在切换到等待状态之前使用旋转锁进行等待。如果旋转一定次数后还没有获得资源,再切换的等待状态。

0 0