关于InitializeCriticalSectionAndSpinCount的疑问
tomcx 2010-01-13 12:05:24 其实也不是使用中的问题,但是有些疑惑。
MSDN中提到InitializeCriticalSectionAndSpinCount函数在单处理器的情况下循环数dwspincount设定无意义,该函数工作机制和InitializeCriticalSection相同,即entercriticalsection失败后就立刻进入wait状态。
从这个函数的工作机制来说,当一个线程使用cs而发现有另一个线程正在使用时,首先不进入wait状态,而是尝试进行指定次数的循环锁等待后才进入wait状态。
个人感觉在单CPU环境下,这个工作机制对于提高性能在某些情况下也可能是有意义的,可为什么实际上这个函数却只能在多处理器环境中发挥机制?
MSDN中举了个例子:多处理器环境下,多线程并发执行争夺heap,可以让没有得到资源的线程先进入循环锁方式而不是直接wait。
可是在单处理器环境下,同样存在上述问题,线程AB争夺heap资源,结果A得到heap,在使用heap的过程中,cpu时间分配给线程B,线程B也存在循环等待还是直接wait的问题,当然从性能上说我同意直接wait,避免了频繁的上下文切换,可是感觉MS的意思是由于系统机制导致只能wait而无法循环等待。
有这个感觉主要是因为查阅了《win核心编程》中的描述如下:如果在单处理器计算机上运行时调用该函数,dwspincount参数将被忽略,它的计数始终被置为0。这是对的,因为在单处理器计算机上设置循环次数是毫无用处的,如果另一个线程正在循环运行,那么拥有资源的线程就不能放弃它。
我对这段话的理解是:在单处理器环境中循环锁一旦工作起来,处于循环等待状态的线程就无法切换到wait模式下。似乎是说操作系统在处理机制上无法实现这种机制,可是想来没有道理无法实现这个机制,不知道是不是我理解有误。
PS:最近做一个程序的优化,脑子有些浆糊,如果想法BT,请见谅。