2012-06-11 16 views
6

पर किसी उदाहरण पर एक ही विधि के लिए एकाधिक थ्रेड बनाना मेरे पास एक प्रश्न है। क्या यह संभव और मान्य है, अगर मेरे पास एक विधि DoSomething() के साथ कोई ऑब्जेक्ट है, यदि मैं इस विधि के लिए एकाधिक थ्रेड बना देता हूं, तो यह काम करेगा और क्या यह स्वयं के अलग थ्रेड के रूप में चलाएगा?ऑब्जेक्ट

उदा।

public class SomeClass 
{ 
    public void DoSomething() 
    { 
     //somethings done here 
    } 
} 

public class MainProgram 
{ 
    public MainProgram() 
    { 
     InitializeComponents(); 
    } 

    protected override OnStart(string[] args) 
    { 
     SomeClass sc = new SomeClass(); 
     Thread workerOne = new Thread(() => sc.DoSomething()); 
     workerOne.Start(); 

     Thread workerTwo = new Thread(() => sc.DoSomething()); 
     workerTwo.Start(); //start a new thread calling same method 
    } 
} 

मुझे उम्मीद है कि इस तरह का अर्थ बताता है कि मेरा क्या मतलब है। क्या यह काम करेगा या कोई समस्या होगी?

मैं एक प्रोग्राम लिख रहा हूं जिसे लगभग रीयलटाइम सॉफ़्टवेयर होने की आवश्यकता है, मैं वर्तमान में निर्णय ले रहा हूं कि कुछ क्लास का नया उदाहरण प्रारंभ करना बेहतर है या नहीं?

आशा है कि कोई जवाब दे सकता है। अगर मेरा प्रश्न समझ में नहीं आता है, तो कृपया टिप्पणी करें और मैं आगे समझाऊंगा!

धन्यवाद,

Base33

पुनश्च कोड विशेष रूप से उदाहरण :)

+0

सी #/.NET का कौन सा संस्करण आप पर हैं? – RobertMS

+0

अनिवार्य लिंक: [जो अल्बाहारी की मुफ्त ईबुक] (http://www.albahari.com/threading/) –

+0

मैं जावा प्रोग्रामर हूं। लेकिन आपके कोड पर नज़र डालने के बाद, ऐसा लगता है कि आप SomeClass के एक ही उदाहरण का पुन: उपयोग कर सकते हैं। हालांकि, केवल एक धागा विधि को चलाने में सक्षम होगा जबकि दूसरा इसकी बारी के लिए इंतजार कर रहा है। कम से कम जावा में क्या होता है। – CKing

उत्तर

12

प्रत्येक थ्रेड में एक अलग कॉल स्टैक होता है, इसलिए हाँ वे दोनों एक ही ऑब्जेक्ट पर एक ही विधि का उपयोग कर सकते हैं। और वास्तव में, यदि आवश्यक हो तो प्रत्येक धागे (रिकर्सन के माध्यम से) उसी विधि को उसी विधि पर कॉल कर सकता है, यदि आप वास्तव में चाहते हैं तो कई बार पर कॉल करें।

हालांकि, हो सकता है यात्रा अप यदि आप उस वस्तु में राज्य उपयोग कर रहे हैं (उदाहरण के या स्थिर क्षेत्रों, आदि, और कुछ भी कि राज्य से संबंधित ) है। आपको यह सुनिश्चित करने की आवश्यकता होगी कि किसी भी साझा स्थिति में आपकी पहुंच बहु-थ्रेडेड पहुंच पर पूर्ण विचार (और संभावित रूप से सिंक्रनाइज़ेशन) प्रदान करती है।

3

हाँ, आप ऐसा कर सकते हैं के लिए लिखा गया था। हालांकि आपको यह सुनिश्चित करना होगा कि उस विधि के भीतर आपका सदस्य एक्सेस थ्रेड सुरक्षित है।

यदि आप ऑब्जेक्ट की स्थिति को म्यूट करते हैं तो आपको या तो अपने पढ़ने और लिखना बंद कर देना चाहिए (किसी भी विशेष तंत्र की बात नहीं करना) या सत्यापित करना चाहिए कि किसी भी समय विधि को इंटरप्ट करने में हानिकारक है और दूसरी कॉल एक अलग थ्रेड पर अभी भी सही ढंग से काम करेगा

1

यह संभव और वैध है, अगर मैं अगर मैं इस विधि के लिए एक से अधिक थ्रेड बनाने के लिए, एक विधि DoSomething() के साथ एक वस्तु है, यह काम करेंगे और यह अपने आप में एक अलग धागे के रूप में चलाने होगा?

हाँ यह संभव है। आपके कोड उदाहरण में, DoSomething को SomeClass के उसी उदाहरण पर बुलाया जा रहा है। दोनों थ्रेड इसे साझा करते हैं। आपके पास दो अलग-अलग धागे हैं लेकिन एक वास्तविक वस्तु साझा की जा रही है।

क्या यह काम करेगा या कोई समस्या होगी?

यह पूरी तरह से आपके उपयोग के मामले पर निर्भर करता है। यह हो सकता है या नहीं। यदि ऑब्जेक्ट्स साझा किए जाते हैं, तो आपको उन्हें एक्सेस सिंक्रनाइज़ करने की आवश्यकता होती है।

1

इसमें कोई समस्या नहीं है। मैं बिना किसी त्रुटि के दौड़ूंगा।

यह इस ऑब्जेक्ट पर ऑब्जेक्ट और कॉल विधि बनाने जैसा है। केवल तथ्य यह है कि एक ही विधि को कॉल करने की दो घटना अलग-अलग धागे पर है।

संबंधित मुद्दे