마이크로 소프트는 실제로 윈도우 서버 2008, Vista에서 길을 InitializeCriticalSection
작품을 변경하고, 아마도
윈도우 7 그들은 당신이 CS의 무리를 할당 할 때 디버그 정보를 사용하는 일부 메모리를 유지하기 "기능"추가. 더 많이 할당할수록 더 많은 메모리가 유지됩니다. 점근 적이며 결국은 평평해질 수 있습니다.
이 '기능'을 사용하지 않으려면 새 API InitalizeCriticalSectionEx을 사용하고 CRITICAL_SECTION_NO_DEBUG_INFO
플래그를 전달해야합니다.
이점은 실제로 기다릴 필요없이 spincount 만 사용되므로 더 빠를 수도 있다는 것입니다.
단점은 이전 응용 프로그램이 호환되지 않을 수 있습니다., 코드를 변경해야하며 플랫폼에 따라 달라집니다 (사용할 버전을 결정하기 위해 버전을 확인해야 함). 또한 필요한 경우 디버그 기능을 사용할 수 없습니다.
테스트 키트는 윈도우 서버 2008 동결 :
을 - 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;
}
으로이 C++ 예제를 빌드 -...이 배치 파일을 실행 (수면이 필요합니다.서버 SDK에서 EXE)
@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
-... 및 출범 300 개 인스턴스를 도달하기 전에 8 기가 바이트 쿼드 CPU 코어 동결과 Win2008 서버를 참조하십시오.
-... Windows 2003 서버에서 반복하면 매력처럼 처리됩니다.
안녕하세요, François. 이 문제에 대한 소식이 있습니까? 나는 호기심 :) – Alex
내 대답보기. "it's-a-feature-not-a-bug"카테고리에 실제로 변화가있었습니다 .... –
안녕하세요, François. 공유해 주셔서 감사합니다. BTW, 당신은 당신의 자신의 대답을 수락하실 수 있습니다;) – Alex