Microsoft ciertamente han cambiado la forma InitializeCriticalSection
obras en Vista, Windows Server 2008, y probablemente también en Windows 7.
Se añadió una "característica" de retener parte de la memoria utilizada para la información de depuración cuando se asigna un grupo de CS. Cuanto más asigna, más memoria se conserva. Puede ser asintótico y finalmente aplanarse (no completamente comprado a este).
Para evitar esta "característica", debe usar la nueva API InitalizeCriticalSectionEx y pasar la bandera CRITICAL_SECTION_NO_DEBUG_INFO
.
La ventaja de esto es que podría ser más rápido ya que, muy a menudo, solo se utilizará el contador de vueltas sin tener que esperar.
Las desventajas son que sus aplicaciones anteriores pueden ser incompatibles, necesita cambiar su código y ahora depende de la plataforma (debe verificar la versión para determinar cuál usar). Y también pierdes la capacidad de depurar si lo necesitas.
kit de prueba para congelar un servidor Windows 2008:
- construir este ejemplo C++ como 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;
}
-... ejecutar este archivo por lotes (necesita el sueño.exe de SDK servidor)
@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
-... y ver un servidor Win2008 con 8 GB y de cuatro núcleos CPU de congelación antes de llegar a los 300 casos lanzados.
-... repetir en un servidor de Windows 2003 y verlo manejarlo como un amuleto.
Hola, François. ¿Tienes alguna noticia sobre este tema? Tengo curiosidad :) – Alex
Ver mi propia respuesta. De hecho, hubo un cambio, en la categoría "es-una-función-no-un-error" ... –
Hola, François. Gracias por compartir. Por cierto, puede aceptar su propia respuesta;) – Alex