CriticalSection
来源:互联网 发布:南卫理公会大学知乎 编辑:程序博客网 时间:2024/05/16 06:05
实际上对 CRITICAL_SECTION 的操作非常轻量,为什么还要加上旋转锁的动作呢?其实这个函数在单cpu的电脑上是不起作用的,只有当电脑上存在不止一个cpu,或者一个cpu但多核的时候,才管用。
如果临界区用来保护的操作耗时非常短暂,比如就是保护一个referencecounter,或者某一个flag,那么几个时钟周期以后就会离开临界区。可是当这个thread还没有离开临界区之前,另外一个thread试图进入此临界区——这种情况只会发生在多核或者smp的系统上——发现无法进入,于是这个thread会进入睡眠,然后会发生一次上下文切换。我们知道contextswitch是一个比较耗时的操作,据说需要数千个时钟周期,那么其实我们只要再等多几个时钟周期就能够进入临界区,现在却多了数千个时钟周期的开销,真是是可忍孰不可忍。
所以就引入了InitializeCriticalSectionAndSpinCount函数,它的第一个参数是指向cs的指针,第二个参数是旋转的次数。我的理解就是一个循环次数,比如说N,那么就是说此时EnterCriticalSection()函数会内部循环判断此临界区是否可以进入,直到可以进入或者N次满。我们增加的开销是最多N次循环,我们可能获得的红利是数千个时钟周期。对于临界区内很短的操作来讲,这样做的好处是大大的。
MSDN上说,他们对于堆管理器使用了N=4000的旋转锁,然后“This gives great performance and scalability in almost all worst-case scenarios.” 可见还是很有用的:-)
http://yjl.spaces.live.com/blog/cns!8129C4219A8E995B!466.entry(失效了)
btw:pthread 没有找到对应的实现~,求指点
- CriticalSection
- CriticalSection
- CriticalSection
- CriticalSection
- CriticalSection原代码
- CriTicalSection Study
- CriticalSection相关函数(转)
- CriticalSection的使用
- 线程同步 CriticalSection
- ReactOS分析CriticalSection
- CriticalSection 临界区保护
- Mutex 和 CriticalSection 的 区别
- 线程同步:CriticalSection关键区域
- CriticalSection临界区封装类
- 多线程同步 CriticalSection(临界区)
- 使用CriticalSection进行线程同步
- Init CriticalSection spin count异常
- 线程同步CriticalSection与Mutex
- MVVM :How to select multiple items in listbox
- 怎样做才能成为程序员高手
- 查询Oracle当前登录用户的所有权限
- 如何获取StatusBar的高度(Android平台)
- Hibernate的检索方式(四)
- CriticalSection
- Hibernate的检索方式(五)
- Hibernate事务与并发等
- SPI时序详解
- BRC全球消费品标准
- awk存入shell数组
- Mac OS X Lion 10.7.2上配置svn服务器
- 详解SPI中的极性CPOL和相位CPHA
- python之强大的日志模块