पर एसटीएल का उपयोग करने वाली बहु-थ्रेडेड Win32 सेवा के साथ मेमोरी समस्याएं मेरे पास सी ++ (वीएस -2010) में लिखी गई एक बहु-थ्रेडेड Win32 सेवा है जो मानक टेम्पलेट लाइब्रेरी का व्यापक उपयोग करती है। कार्यक्रम का व्यवसाय तर्क ठीक से काम करता है, लेकिन जब कार्य प्रबंधक (या संसाधन प्रबंधक) को देखते हैं तो प्रोग्राम एक चलनी की तरह स्मृति को रिसाव करता है।वीएस -2010
मेरे पास एक परीक्षण सेट है जो लगभग 16 एक साथ अनुरोध/सेकंड औसत है। जब कार्यक्रम पहली बार शुरू होता है तो यह 1.5 एमबी रैम के पड़ोस में कहीं भी खपत करता है। पूर्ण परीक्षण चलाने के बाद (जिसमें 12-15 मिनट लगते हैं) मेमोरी खपत 12 एमबी के करीब कहीं खत्म होती है। आम तौर पर, यह एक प्रोग्राम के लिए एक समस्या नहीं होगी जो एक बार चलता है और फिर समाप्त हो जाता है, लेकिन इस कार्यक्रम का उद्देश्य लगातार चलना है। वास्तव में बहुत बुरा है।
समस्या को हल करने और संकुचित करने के लिए, मैंने एक बहुत ही छोटा परीक्षण आवेदन बनाया जो प्रत्येक 250ms में एक बार की दर से कार्यकर्ता धागे को स्पिन करता है। कार्यकर्ता थ्रेड एक नक्शा बनाता है और इसे छद्म-यादृच्छिक डेटा के साथ पॉप्युलेट करता है, मानचित्र को खाली करता है, और फिर बाहर निकलता है। यह कार्यक्रम भी फैशन की तरह स्मृति को रिसाव करता है, इसलिए मैं सोच रहा हूं कि समस्या एसटीएल के साथ अपेक्षित स्मृति को जारी नहीं कर रही है।
मैंने वीएलडी को लीक की तलाश करने की कोशिश की है और मुझे एक जोड़ा मिला है जिसे मैंने उपचार किया है, लेकिन फिर भी समस्या बनी हुई है। मैंने होर्ड को एकीकृत करने की कोशिश की है, लेकिन इसने वास्तव में समस्या को और भी खराब कर दिया है (मैं शायद इसे ठीक से एकीकृत नहीं कर रहा हूं, लेकिन मैं नहीं देख सकता)।
तो मैं निम्नलिखित प्रश्न पूछना चाहता हूं: क्या एक ऐसा प्रोग्राम बनाना संभव है जो एक बहु-थ्रेडेड वातावरण में एसटीएल का उपयोग करता है जो स्मृति को रिसाव नहीं करेगा? पिछले हफ्ते के दौरान मैंने इस कार्यक्रम में 200 से भी कम बदलाव नहीं किए हैं। मैंने परिवर्तनों के नतीजों की योजना बनाई है और उनके सभी में एक ही मूल प्रोफ़ाइल है। मैं उन सभी एसटीएल भलाई को हटाना नहीं चाहता हूं जिन्होंने इस एप्लिकेशन को इतना आसान बना दिया है। मैं किसी भी सुझाव की सराहना करता हूं कि मैं इस ऐप को स्टाइल से बाहर जाने की तरह स्मृति को लीक किए बिना कैसे काम कर सकता हूं।
किसी भी मदद के लिए धन्यवाद!
पीएस मैं निरीक्षण/व्यक्तिगत संपादन के लिए मेमोरी टेस्ट की एक प्रति पोस्ट कर रहा हूं।
#include <string>
#include <iostream>
#include <Windows.h>
#include <map>
using namespace std;
#define MAX_THD_COUNT 1000
DWORD WINAPI ClientThread(LPVOID param)
{
unsigned int thdCount = (unsigned int)param;
map<int, string> m;
for (unsigned int x = 0; x < 1000; ++x)
{
string s;
for (unsigned int y = 0; y < (x % (thdCount + 1)); ++y)
{
string z = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
unsigned int zs = z.size();
s += z[(y % zs)];
}
m[x] = s;
}
m.erase(m.begin(), m.end());
ExitThread(0);
return 0;
}
int main(int argc, char ** argv)
{
// wait for start
string inputWait;
cout << "type g and press enter to go: ";
cin >> inputWait;
// spawn many memory-consuming threads
for (unsigned int thdCount = 0; thdCount < MAX_THD_COUNT; ++thdCount)
{
CreateThread(NULL, 0, ClientThread, (LPVOID)thdCount, NULL, NULL);
cout
<< (int)(MAX_THD_COUNT - thdCount)
<< endl;
Sleep(250);
}
// wait for end
cout << "type e and press enter to end: ";
cin >> inputWait;
return 0;
}
'm.erase (m.begin(), m.end()) अधिकांश पुस्तकों में' m.clear() 'होगा, लेकिन चूंकि यह प्राप्ति के बाद समाप्त हो जाती है, फिर भी सुनिश्चित नहीं है यह भी क्यों है। इसके अलावा, आप विखंडन और/या अशुद्ध सीआरटी-शटडाउन का अनुभव कर रहे हैं। इसके लिए, आपको अपने धागे के लिए '_beginthreadex()' का उपयोग करना चाहिए, और * बाहर * बाहर निकलने के लिए बाहर निकलना नहीं है। थ्रेड प्रो-रिटर्न के माध्यम से समाप्त होने दें। इसके अलावा, आप प्रत्येक निष्पादन के साथ एक थ्रेड हैंडल लीक कर रहे हैं। इसे 'CreateThread()' के तुरंत बाद बंद किया जाना चाहिए, जो वर्तमान में हैंडल को भी सहेज नहीं रहा है। – WhozCraig
मैं पोस्ट से ExitThread() को निकालना भूल गया था। मैंने कोशिश की कि एक बार और यह मदद करने के लिए कुछ भी नहीं किया है इसलिए मैंने इसे तुरंत हटा दिया। आप स्पष्ट के बारे में सही हैं, और मैंने दोनों संस्करणों का उपयोग किया है, अगर कुछ छिपा हुआ था जो मैं खो रहा था। मैं यह देखने के लिए '_beginthreadex()' का उपयोग करने में देखता हूं कि इससे मदद मिलती है या नहीं। मैं थ्रेड हैंडल बंद करने से पूरी तरह से चूक गया। धन्यवाद! –
यहां देखें http://support.microsoft.com/kb/104641/en-gb यह कुछ भी नहीं हो सकता – James