【发布时间】:2009-07-23 16:46:45
【问题描述】:
令我们惊讶的是,我们最近发现了this。对于 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 之前的版本?
【问题讨论】:
标签: windows-vista windows-server-2008 windows-server-2003 critical-section