माइक्रोसॉफ्ट वास्तव में, Vista पर InitializeCriticalSection
काम करता है जिस तरह से बदल दिया है विंडोज सर्वर 2008, और शायद यह भी विंडोज 7
वे एक "सुविधा" कुछ जब आप सीएस का एक समूह का आवंटन डिबग जानकारी के लिए इस्तेमाल किया स्मृति को बनाए रखने के लिए जोड़ा। जितना अधिक आप आवंटित करेंगे, उतनी ही स्मृति बरकरार रहेगी। यह असीमित हो सकता है और अंततः बाहर निकलता है (पूरी तरह से इसे खरीदा नहीं जाता है)।
इस "फीचर" से बचने के लिए, आपको नए एपीआई InitalizeCriticalSectionEx का उपयोग करना होगा और ध्वज CRITICAL_SECTION_NO_DEBUG_INFO
पास करना होगा।
इसका लाभ यह है कि यह तेजी से हो सकता है, अक्सर, केवल स्पिनकाउंट का उपयोग वास्तव में प्रतीक्षा किए बिना किया जाएगा।
नुकसान यह है कि आपके पुराने एप्लिकेशन असंगत हो सकते हैं, आपको अपना कोड बदलना होगा और अब यह प्लेटफार्म निर्भर है (आपको यह निर्धारित करने के लिए संस्करण की जांच करनी है कि कौन सा उपयोग करना है)। और यदि आपको आवश्यकता हो तो आप डीबग करने की क्षमता खो देते हैं। एक विंडोज सर्वर 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;
}
के रूप में इस सी ++ उदाहरण निर्माण -... इस बैच फ़ाइल चलाएं (नींद की जरूरत है।सर्वर एसडीके से 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 उदाहरणों तक पहुँचने से पहले 8GB और ट्रैक्टर सीपीयू कोर ठंड के साथ एक Win2008 सर्वर देखते हैं।
-... विंडोज 2003 सर्वर पर दोहराएं और इसे एक आकर्षण की तरह संभालें।
स्रोत
2009-05-20 19:42:25
हाय, फ्रैंकोइस। क्या आपके पास इस मुद्दे पर कोई खबर है? मैं उत्सुक हूँ :) – Alex
मेरा खुद का जवाब देखें। वास्तव में एक बदलाव था, "यह एक-फीचर-ए-ए-बग" श्रेणी में .... –
हाय, फ्रैंकोइस। साझा करने के लिए धन्यवाद। बीटीडब्ल्यू, आप अपना जवाब स्वीकार कर सकते हैं;) – Alex