Frage

Zu unserer großen Überraschung fanden wir kürzlich this . Mit SP1 für Windows 2003 Microsoft geändert, um eine Art und Weise kritische Abschnitte verhalten. Frühere Themen wollen sie zuzugreifen wurden in FIFO-Weise serviert. Im Moment sind sie in rein „zufällig“ Art und Weise serviert.

In unserem Fall hatten wir so etwas wie folgt aus:

// 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);
}

So mit neuer Implementierung von kritischem Abschnitt in 2003 SP2 AddToList könnte in Hunger sterben, da es keine guarantie ist, dass es erwachen wird.

Dieses Beispiel ist ein wenig extrem, aber auf der anderen Seite habe ich Millionen Zeilen Code, der mit Annahme geschrieben wurden, die auf kritische Abschnitte Zugriff serialisiert.

Gibt es eine Möglichkeit, diesen neuen kritischen Abschnitt zu deaktivieren?

EDIT: Da alte Version immer wieder nicht möglich ist, ich nur tun, globale Suche denke & ändern ersetzen, um {Enter, Leaver} Critical in so etwas wie mein {Enter Leave} Critical. Haben Sie Ideen, wie diese umgesetzt werden sollte, so verhält es sich genau wie Pre-SP2-Version?

War es hilfreich?

Lösung

Das ist ein bekanntes Problem: http: //www.bluebytesoftware.com/blog/PermaLink,guid,e40c2675-43a3-410f-8f85-616ef7b031aa.aspx Leider ist der einzige Weg zu sein scheint Code so strukturieren, dass sie weniger Zeit in kritischem Abschnitt verbringen.

Andere Tipps

Leider haben Sie ein Problem. Was Sie getan haben, ist, schreiben Sie den Code in Abhängigkeit von einer Implementierung Detail, und nicht auf die spec.

Entercriticalsection hat immer dokumentiert nicht auf eine bestimmte Reihenfolge zu garantieren, dass Threads den Abschnitt erwerben, aber die Tatsache, dass sie so in einem FIFO-Weise tat, in älteren Versionen des Betriebssystems, ist das, was Sie Ihren Code basiert haben um.

Die Art und Weise diese neue Art von Verhalten zu deaktivieren ist nicht SP1 zu installieren.

Nun, gesagt haben, dass ich nicht glaube, dass es schädliche Probleme mit Ihrem Code sein, wenn Sie Ihre Fäden völlig unterschiedliche Prioritäten haben. Sicher, eine der beiden Methoden kann der Abschnitt mehr als einmal in einer Reihe erwerben, auch wenn die anderen Verfahren auch warten, aber das sollte kein Problem sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top