2012-11-13 42 views
10

यह थोड़ा पागल लग सकता है, लेकिन यह एक दृष्टिकोण है जिसे मैं एक बड़ी लाइब्रेरी के हिस्से के रूप में विचार कर रहा हूं, अगर मैं उचित रूप से निश्चित हो सकता हूं कि यह अजीब व्यवहार नहीं करेगा।मल्टीप्लेक्सिंग सी # 5.0 के थ्रेड पूल पर एसिंक - थ्रेड सुरक्षित?

दृष्टिकोण:

एक SynchronizationContext कि एक थ्रेड पूल के लिए डिस्पैच के साथ भागो async उपयोगकर्ता कोड।

async void DoSomething() 
{ 
    int someState = 2; 
    await DoSomethingAsync(); 
    someState = 4; 
    await DoSomethingElseAsync(); 
    // someState guaranteed to be 4? 
} 

मुझे विश्वास है कि क्या someState के लिए उपयोग threadsafe होगा नहीं कर रहा हूँ: उपयोगकर्ता कोड कुछ ऐसा दिखाई देगा। जबकि कोड एक "थ्रेड" में चलाया जाएगा, जैसे ऑपरेशन वास्तव में पूरी तरह से आदेश दिया गया है, फिर भी इसे हुड के नीचे कई धागे में विभाजित किया जा सकता है। अगर मेरी समझ सही है, तो आदेश x86 पर सुरक्षित होना चाहिए, और चूंकि चर साझा नहीं किया गया है, इसलिए मुझे कंपाइलर अनुकूलन के बारे में चिंता करने की आवश्यकता नहीं होगी और इसी तरह।

अधिक महत्वपूर्ण बात यह है कि, मुझे इस बात से चिंतित है कि यह ईसीएमए या सीएलआर मेमोरी मॉडल के तहत थ्रेड-सुरक्षित की गारंटी होगी या नहीं।

मुझे काफी यकीन है कि मुझे कतारबद्ध टुकड़े को निष्पादित करने से पहले मेमोरी बाधा डालने की आवश्यकता होगी, लेकिन मुझे यहां मेरे तर्क में पूरी तरह से विश्वास नहीं है (या यह दृष्टिकोण पूरी तरह से अलग कारणों से अप्रभावी हो सकता है) ।

+5

यह एक स्थानीय चर है। यह थ्रेडसेफ कैसे नहीं हो सकता है? IOW आपको क्या लगता है कि इसे किसी अन्य धागे में बदला जा सकता है? (जब तक आप इसे कहीं भी संदर्भित नहीं कर रहे हैं, जिसे दिखाया नहीं जा रहा है यानी 'रेफरी' या कैप्चर वैरिएबल के रूप में)। – leppie

+3

जो मैं समझता हूं उससे, 'प्रतीक्षा' निम्नलिखित कोड को एक निरंतरता में बदल देता है जो अंतर्निहित 'कार्य' समाप्त होने पर वर्तमान 'सिंक्रनाइज़ेशन कॉन्टेक्स्ट' पर निष्पादित हो जाता है। यदि यह थ्रेड पूल में प्रेषण कर रहा है, तो निरंतरता एक अलग थ्रेड पर चल सकती है। यह किसी भी तरह से * समवर्ती * नहीं चलाएगा, लेकिन मुझे यकीन नहीं है कि निरंतरता एक अलग भौतिक धागे पर निष्पादित होने पर 'someState' में परिवर्तनों को दृश्यमान होने की गारंटी दी जाएगी। – ShZ

+2

यह एक अच्छा सवाल है, जिसमें बहुत से लोग पूछने के लिए भी नहीं जानते हैं। –

उत्तर

9

यह async/await FAQ की टिप्पणी अनुभाग में जवाब है: जब कार्य पंक्तिबद्ध और कार्य निष्पादन की शुरुआत/अंत में कर रहे हैं ताकि मूल्यों उचित रूप से दृश्यमान हो जाने

TPL उचित बाधाओं शामिल हैं।

इसलिए कोई स्पष्ट बाधा आवश्यक नहीं है।

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

  • कोई संबंधित समस्या नहीं^_^