मैं नए समवर्ती संग्रह में पढ़ रहा हूं और विशेष रूप से ConcurrentBag मेरा ध्यान मिला है। चूंकि ConcurrentBag आंतरिक रूप से वस्तुओं का ट्रैक रखने के लिए प्रत्येक व्यक्तिगत थ्रेड पर स्थानीय सेट रखता है, इसका मतलब है कि जब धागा स्वयं स्कोप से बाहर हो जाता है, तब भी इसे ConcurrentBag द्वारा स्मृति में संदर्भित किया जाएगा। बदले में इसका मतलब धागा, साथ ही मूल संसाधनों द्वारा दावा किया गया दोनों स्मृति है? (.NET थ्रेड ऑब्जेक्ट के सटीक आंतरिक कार्य को जानने के लिए मुझे क्षमा करें)ConcurrentBag में संभावित मेमोरीकैक?
मैं एक उपयोगिता मान सकता हूं जहां आपके पास एक बहुभाषी webservice के लिए 1 वैश्विक ConcurrentBack है जहां आपके पास बहुत से ग्राहक कार्य जोड़ रहे हैं। इन कार्यों को थ्रेडपूल पर धागे द्वारा जोड़ा जाता है। अब थ्रेडपूल धागे को प्रबंधित करने का एक बहुत ही प्रभावी तरीका है लेकिन यह काम की मात्रा के आधार पर थ्रेड को हटा देता है और बनाता है। इसलिए, इस तरह की एक webservice कभी-कभी परेशानी में पड़ सकती है क्योंकि अंतर्निहित बैग अभी भी कई लोगों को संदर्भित किया जाना चाहिए-नष्ट धागे होना चाहिए।
मैं इस व्यवहार को परीक्षण करने के लिए एक त्वरित एप्लिकेशन बनाया:
static ConcurrentBag<int> bag = new ConcurrentBag<int>();
static void FillBag() { for (int i = 0; i < 100; i++) { bag.Add(i); } }
static void PrintState() { Console.WriteLine("Bag size is: {0}", bag.Count); }
static void Main(string[] args)
{
var remote = new Thread(x =>
{
FillBag();
PrintState();
});
// empty bag
PrintState();
// first 100 items are added on main thread
FillBag();
PrintState();
// second 100 items are added on remote thread
remote.Start();
remote.Join();
// since the remote thread is gone out of scope, what happened to its local storage which is part of the bag?
PrintState();
// now force a cleanup
WeakReference weakRemoteReference = new WeakReference(remote);
remote = null;
GC.Collect();
GC.WaitForPendingFinalizers();
// Now check if the thread still exists
if (weakRemoteReference.IsAlive)
Console.WriteLine("Remote thread still exists");
PrintState();
Console.ReadLine();
और उत्पादन मेरी कहानी की पुष्टि करता है:
Bag size is: 0
Bag size is: 100
Bag size is: 200
Bag size is: 200
Remote thread still exists
Bag size is: 200
इस व्यवहार की उम्मीद की जा करने के लिए है, मैं अपने परीक्षण में एक गलती करते हैं किया या इसे एक डिजाइन दोष माना जा सकता है?
ध्यान दें कि मैं रिमोट थ्रेड का नाम गुंजाइश से बाहर चला गया हूं, अभी भी इसका दायरा है और कह सकता है: "चूंकि रिमोट थ्रेड समाप्त हो गया है" – Polity