Windows 2003 SP1中关键部分的行为更改

| 今天,我在MSDN中遇到了这个问题:   \“从Windows Server 2003开始   与Service Pack 1(SP1),线程   等待关键部分不要   获得关于   先到先得的原则。这个   变化提高绩效   对于大多数代码来说意义重大。然而,   有些应用程序需要先入先出,   先进先出(FIFO)排序,并且可能   表现不佳或根本不表现   Windows的当前版本(对于   例如,已经   使用关键部分作为   限速器)。为了确保您的   代码继续正常工作,您   可能需要添加其他级别的   同步。例如,假设   你有一个生产者线程和一个   使用线程的使用者线程   关键部分对象进行同步   他们的工作。创建两个事件对象,   每个线程使用一个信号   准备好其他线程了   继续。消费者线程将   等待生产者发出信号   进入严重之前的事件   部分,生产者线程将   等待使用者线程发出信号   进入关键事件之前的事件   部分。每个线程离开后   关键部分,它指示事件   释放另一个线程。\“ 起初,我以为是WTF ?! -我一直以为线程将按照尝试获取关键部分的顺序获取关键部分。尽管这似乎对Service Pack的行为而言是一个奇怪的大变化,但我相信该Service Pack适用于Windows的Server Edition,而Vista仍在开发中。 无论如何,所以这有点有意义-至少我认为,这样调度程序旋转到的下一个等待线程将成为下一个获取关键部分的线程。因此,这是唯一有意义的事情,除非他们决定随机选择乐趣;)。 尽管如此,这仍然是我的假设,现在正在评估我的代码,以确保没有FIFO依赖的情况成为问题。 有人在现实世界中有任何问题吗?尽管获取关键部分的线程顺序不保证为FIFO,但通常不是FIFO吗?如果不是通常的FIFO(或接近FIFO),有人知道一个线程可以等待激烈竞争的关键部分多长时间吗?如果它是低优先级线程,这是否意味着如果总是有更高优先级的线程试图获取关键部分,它可能会一直无限期地等待(即使低优先级线程很久以前如果遵循FIFO则是下一个线程) )?是否有防止这种情况发生的安全措施,还是必须依赖于辅助同步对象? 当然,这实际上仅在竞争激烈的关键部分才有意义。 我不知道,也许我做的太多了……但是有些事情困扰着我。任何见解均表示赞赏。谢谢 ;)     
已邀请:
以我的经验,关键的部分从来没有使用过FIFO(也许文档团队认为这是2003年的新功能)。是的,它可能导致线程匮乏,这已经见过很多。如果需要FIFO,则需要一个互斥锁。 互斥对象是内核对象,因此获取它们比第3环乐观关键部分要昂贵。但是FIFO并不是您可以(或应该)将这些不必要的事情一无所获的事情之一,并且它与线程的“层次结构”没有任何关系(无论是什么—都意味着优先?)。相同优先级的1000个线程碰到一个锁将很容易导致饥饿。     
这是我第一次听到此消息,当我考虑它时,似乎没有问题。 如果我正确理解:: 旧方式:
Thread A acquired the CritSec
Thread B waiting for the CritSec , tried to acquire it at time t
Thread C waiting for the CritSec , tried to acquire it at time t + dt

When Thread A releases the CritSec, OS ensures that Thread B acquires it.
新的方法 :
Thread A acquired the CritSec
Thread B waiting for the CritSec , tried to acquire it at time t
Thread C waiting for the CritSec , tried to acquire it at time t + dt

When Thread A releases the CritSec, OS may choose any Thread to acquire it. So, it may be Thread B or C that will acquire it after A releases it.
我从来没有假设(也不认为有人假设)等待CritSec的线程会按照他们想要获取它的顺序来获取它。 对于某些探查器/调试器或进行此假设的性能监视机制而言,这可能是一个问题。     

要回复问题请先登录注册