Microsoft hat in der Tat die Art und Weise InitializeCriticalSection
Arbeiten auf Vista, Windows Server 2008, geändert und wahrscheinlich auch Windows 7.
Sie fügten hinzu, ein „Feature“ etwas Speicher für Debug-Informationen verwendet zu halten, wenn Sie eine Reihe von CS zuordnen. Je mehr Sie zuweisen, desto mehr Speicher bleibt erhalten. Es könnte asymptotisch und schließlich flach sein (nicht vollständig gekauft zu diesem).
Um dieses "Feature" zu vermeiden, müssen Sie die neue API InitalizeCriticalSectionEx verwenden und das Flag CRITICAL_SECTION_NO_DEBUG_INFO
übergeben.
Der Vorteil davon ist, dass es schneller sein kann, da sehr oft nur der Spincount verwendet wird, ohne tatsächlich warten zu müssen.
Die Nachteile sind, dass Ihre alten Anwendungen inkompatibel sein können, müssen Sie Ihren Code ändern und es ist jetzt plattformabhängig (Sie müssen für die Version zu bestimmen, welche zu verwenden). Und Sie verlieren auch die Fähigkeit zu debuggen, wenn Sie brauchen.
Testkit einen Windows Server 2008 einzufrieren:
- bauen Sie dieses C++ Beispiel als CSTest.exe
#include "stdafx.h"
#include "windows.h"
#include <iostream>
using namespace std;
void TestCriticalSections()
{
const unsigned int CS_MAX = 5000000;
CRITICAL_SECTION* csArray = new CRITICAL_SECTION[CS_MAX];
for (unsigned int i = 0; i < CS_MAX; ++i)
InitializeCriticalSection(&csArray[i]);
for (unsigned int i = 0; i < CS_MAX; ++i)
EnterCriticalSection(&csArray[i]);
for (unsigned int i = 0; i < CS_MAX; ++i)
LeaveCriticalSection(&csArray[i]);
for (unsigned int i = 0; i < CS_MAX; ++i)
DeleteCriticalSection(&csArray[i]);
delete [] csArray;
}
int _tmain(int argc, _TCHAR* argv[])
{
TestCriticalSections();
cout << "just hanging around...";
cin.get();
return 0;
}
-... Führen Sie diese Batchdatei (braucht den Schlaf.exe vom Server SDK)
@rem you may adapt the sleep delay depending on speed and # of CPUs
@rem sleep 2 on a duo-core 4GB. sleep 1 on a 4CPU 8GB.
@for /L %%i in (1,1,300) do @echo %%i & @start /min CSTest.exe & @sleep 1
@echo still alive?
@pause
@taskkill /im cstest.* /f
-... und sehen einen Win2008 Server mit 8 GB und Kern Einfrieren Quad CPU bevor die 300-Instanzen gestartet erreichen.
-... wiederholen Sie auf einem Windows 2003-Server und sehen Sie es wie ein Charme behandeln.
Hallo, François. Hast du Neuigkeiten zu diesem Thema? Ich bin neugierig :) – Alex
Siehe meine eigene Antwort. Es gab tatsächlich eine Veränderung, in der Kategorie "Es ist ein Feature-kein-Bug" .... –
Hallo, François. Danke für das Teilen. Übrigens kannst du deine eigene Antwort annehmen;) – Alex