Microsoft действительно изменили способ InitializeCriticalSection
работы на Vista, Windows Server 2008, и, вероятно, также для Windows 7.
Они добавили «особенность», чтобы сохранить некоторую память, используемую для получения информации отладки, когда вы выделяете кучу CS. Чем больше вы выделяете, тем больше памяти сохраняется. Это может быть асимптотическим и, в конечном счете, сглаженным (не полностью купленным для этого).
Чтобы избежать этой «функции», вам необходимо использовать новый API InitalizeCriticalSectionEx и передать флаг CRITICAL_SECTION_NO_DEBUG_INFO
.
Преимущество этого заключается в том, что он может быть быстрее, так как очень часто используется только spincount без фактического ожидания.
Недостатки в том, что ваши старые приложения могут быть несовместимыми, вам нужно изменить свой код, и теперь он зависит от платформы (вы должны проверить версию, чтобы определить, какой из них использовать). А также вы теряете возможность отладки, если вам нужно.
комплект тест заморозить Windows Server 2008:
- построить этот пример C++, как 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;
}
-... Запустите этот пакетный файл (необходим сон.EXE с сервера 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
-... и увидеть сервер Win2008 с 8GB и ядра процессора Quad замораживания до достижения 300 экземпляров запущен.
-... повторить на сервере Windows 2003 и увидеть, как он обрабатывает его как шарм.
Привет, Франсуа. У вас есть новости по этому вопросу? Мне любопытно :) – Alex
См. Мой собственный ответ. На самом деле произошли изменения в категории «it-a-feature-not-a-bug» .... –
Привет, Франсуа. Спасибо, что поделился. BTW, вы можете принять свой собственный ответ;) – Alex