令我们大吃一惊的是,我们最近发现了这个。对于 Windows 2003 的 SP1,Microsoft 改变了临界区的行为方式。想要访问它们的早期线程以 FIFO 方式提供服务。现在,它们以纯粹的“随机”方式提供服务。
在我们的例子中,我们有这样的事情:
// I now it's kind of ugly design but works
void Class:RunInThread()
{
while(m_Running)
{
EnterCriticalSection(&m_CS);
DoSomeStuffWithList();
LeaveCriticalSection(&m_CS);
}
}
void Class::AddToList()
{
EnterCriticalSection(&m_CS);
AddSomeStuffToList();
LeaveCriticalSection(&m_CS);
}
因此,随着 2003 SP2 中关键部分的新实现,AddToList 可能会死于饥饿,因为无法保证它会被唤醒。
这个例子有点极端,但另一方面,我有数百万行代码是在假设对关键部分的访问是序列化的情况下编写的。
有没有办法关闭这个新的关键部分?
编辑:由于无法返回旧版本,我正在考虑只进行全局搜索和替换以将 {Enter,Leaver}CriticalSection 更改为 My{Enter,Leave}CriticalSection。您是否知道应该如何实现它以使其行为与 SP2 之前的版本完全一样?