अद्यतन करने वाले मल्टीथ्रेडिंग समस्या को समझने में कठिनाई है कि क्यों थ्रेड पूरा होने से पहले बहुप्रतिष्ठण मानों को अद्यतन करने में विफल रहता है। क्या अलग धागे में संदर्भ या मूल्यों की अपनी प्रति है?
मान
यदि नहीं, तो मेरी समझ करने के लिए नीचे दिए गए कोड को ठीक से काम करना चाहिए जब MyMethod कहा जाता है, लेकिन अक्सर यह thread.IsAlive
से पहले सरणी में कुछ MyType वस्तुओं के उदाहरण का निर्माण नहीं करता झूठा हो जाता है:
class MyClass
{
static MyType[] obj = new MyType[Environment.ProcessorCount - 1];
void MyMethod()
{
Thread[] threads = new Thread[Environment.ProcessorCount - 1];
for (int i = 0; i < Environment.ProcessorCount - 1; i++)
{
threads[i] = new Thread(() => FillObjects(i));
threads[i].Priority = ThreadPriority.AboveNormal;
threads[i].Start();
}
while (threads[i].Any(c => c.IsAlive))
{
Thread.Sleep(50);
}
}
void FillObjects(int i)
{
obj[i] = new MyType();
//perform actions with obj[i] to fill it with necessary values
}
}
अच्छा बिंदु। यदि 'FillObjects()' में पहला कथन 'थ्रेड। स्लीप (1000)' संभवतः केवल 'obj [Environment.ProcessorCount - 1] 'गैर-शून्य होगा क्योंकि लूप ने इसके अंत मूल्य में' i' बढ़ाया होगा पहली वस्तु बनने से पहले। इसके बारे में सोचते हुए, FillObjects() फेंक सकता है क्योंकि लूप से बाहर निकलने से पहले 'i' वास्तव में' पर्यावरण 'प्रोसेसर काउंटर -1' में वृद्धि हुई है और इस प्रकार 'ओबीजे' की सीमा से बाहर है। –
उत्तर के लिए धन्यवाद, वास्तव में यह बड़ी समस्याओं में से एक था, अब यह वस्तुओं को ठीक से चालू करता है। हालांकि धागा बंद होने से पहले सभी परिचालनों को ठीक से पूरा नहीं करता है और यह यादृच्छिक रूप से करता है। कोई सुझाव? – Almis
मुझे अपनी खुद की तार्किक गलती मिली है, अब यह ठीक से काम करता है। – Almis