Microsoft hanno infatti cambiato il modo InitializeCriticalSection
opere su Vista, Windows Server 2008, e probabilmente anche Windows 7.
hanno aggiunto una "caratteristica" di mantenere una certa memoria utilizzata per le informazioni di debug quando si assegna un gruppo di CS. Più si assegna, più memoria viene mantenuta. Potrebbe essere asintotico e alla fine appiattirsi (non completamente acquistato per questo).
Per evitare questo "caratteristica", è necessario utilizzare la nuova API InitalizeCriticalSectionEx e passare il flag CRITICAL_SECTION_NO_DEBUG_INFO
.
Il vantaggio è che potrebbe essere più veloce poiché, molto spesso, verrà utilizzato solo lo spincount senza dover attendere effettivamente.
Gli svantaggi sono che le vecchie applicazioni possono essere incompatibili, è necessario modificare il codice ed è ora dipendente dalla piattaforma (è necessario verificare la versione per determinare quale utilizzare). E inoltre si perde la possibilità di eseguire il debug se necessario.
kit di test per bloccare Windows Server 2008:
- costruire questo esempio C++ come 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;
}
-... eseguire questo file batch (ha bisogno del sonno.exe da SDK del server)
@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
-... e vedere un server Win2008 con 8GB e quad core CPU di congelamento prima di raggiungere i 300 casi lanciati.
-... ripetere su un server Windows 2003 e vederlo gestirlo come un incantesimo.
fonte
2009-05-20 19:42:25
Ciao, François. Avete notizie su questo problema? Sono curioso :) – Alex
Vedi la mia risposta. C'era davvero un cambiamento nella categoria "it's-a-feature-not-a-bug" ... –
Ciao, François. Grazie per la condivisione. A proposito, è possibile accettare la propria risposta;) – Alex