2012-09-16 36 views
5

यदि कोई थ्रेड ए एक वैरिएबल वी को लिखने के एकमात्र उद्देश्य के साथ एक और थ्रेड बी स्पॉन्स करता है और उसके बाद इसे समाप्त करने की प्रतीक्षा करता है, तो यह सुनिश्चित करने के लिए स्मृति-बाधाएं होती हैं कि थ्रेड ए पर वी के बाद के पढ़ने ताजा हैं? मैं अनिश्चित हूं कि समाप्ति/जुड़ने वाले संचालन में कोई अंतर्निहित बाधाएं हैं जो उन्हें अनावश्यक बनाती हैं।धागे पर शामिल होने पर स्मृति-बाधाओं की आवश्यकता होती है?

public static T ExecuteWithCustomStackSize<T> 
    (Func<T> func, int stackSize) 
{ 
    T result = default(T); 

    var thread = new Thread(
     () => 
       { 
        result = func(); 
        Thread.MemoryBarrier(); // Required? 
       } 
     , stackSize); 

    thread.Start(); 
    thread.Join(); 

    Thread.MemoryBarrier(); // Required? 
    return result; 
} 

या तो/दोनों (या अधिक) ऊपर स्निपेट में बाधाओं के लिए आवश्यक हैं कर रहे हैं:

यहाँ एक उदाहरण है?

+4

मुझे संदेह है कि स्मृति बाधा आवश्यक है। अगर वे थ्रेड थे। जॉइन बहुत बेकार होगा और बहुत से लोग परेशानी में होंगे। धागे खत्म होने तक प्रतीक्षा करें, जिसमें वैरिएबल को मान असाइन करना शामिल होगा। – Despertar

+0

इस धागे को देखें: http://stackoverflow.com/questions/6581848/memory-barrier- जनरेटर – Laurijssen

उत्तर

0

प्रलेखन ऐसा लगता है कि वे आवश्यक नहीं हैं से -

MemoryBarrier केवल कमजोर स्मृति आदेश के साथ मल्टीप्रोसेसर सिस्टम पर की आवश्यकता है (उदाहरण के लिए, एक प्रणाली कई इंटेल Itanium प्रोसेसर प्रयोग करते हैं)।

अधिकांश उद्देश्यों के लिए, सी # लॉक स्टेटमेंट, विजुअल बेसिक सिंकलॉक स्टेटमेंट, या मॉनीटर क्लास डेटा सिंक्रनाइज़ करने के आसान तरीके प्रदान करता है।

जैसा कि आप शामिल होने के साथ अवरुद्ध कर रहे हैं, यह और भी आवश्यक नहीं है।

0

आपको पहली मेमोरी बाधा की आवश्यकता नहीं है। आपको केवल उन डेटा तक पहुंचने से पहले कॉल करने की आवश्यकता है जिन्हें एक अलग थ्रेड में संशोधित किया गया है। चूंकि आप 'थ्रेड' के अंदर ऐसा नहीं कर रहे हैं, इसलिए आपको कॉल की आवश्यकता नहीं है।

यदि आप कॉल कॉल रखने की योजना बनाते हैं तो आप दूसरे से छुटकारा पा सकते हैं। यदि आप दूसरी कॉल रखते हैं, तो आप शामिल होने से छुटकारा पा सकते हैं।

3

नहीं, सिंक्रनाइज़ेशन तंत्र अंतर्निहित स्मृति बाड़ उत्पन्न करते हैं। थ्रेड द्वारा संशोधित सभी डेटा थ्रेड होने के बाद दिखाई देगा।

+1

आपके उत्तर के लिए धन्यवाद। इसे वापस करने के लिए कोई दस्तावेज? – Ani

+1

@Ani: इस स्रोत में: http://www.albahari.com/threading/part4.aspx (जो अब तक सभी जानते हैं), वे बाड़ उत्पन्न करने के रूप में लगभग हर सिंक्रनाइज़ेशन तंत्र का उल्लेख करते हैं। वे स्पष्ट रूप से 'जॉइन' का उल्लेख नहीं करते हैं, लेकिन चूंकि यह कॉलिंग थ्रेड को उसी स्थिति में 'मॉनिटर। वैट' के रूप में रखता है, उदाहरण के लिए, यह एक मजबूत संकेत है कि इसे बाड़ भी उत्पन्न करना चाहिए। इसके अलावा, 'कार्य' पर प्रतीक्षा भी किया गया है। हालांकि धागे में शामिल होना थोड़ा अलग है, मैं उम्मीद करता हूं कि यह वही स्मृति आदेश गारंटी प्रदान करे। – Tudor

+0

मैंने इसे पढ़ा था, लेकिन यह सुनिश्चित नहीं था कि यह निर्णायक था, जैसा कि आप कहते हैं, यह स्पष्ट रूप से 'जॉइन' का उल्लेख नहीं करता था। – Ani