मैंने अभी देखा है कि .NET कोर Threadpool.QueueUserWorkItem का एक अधिभार प्रस्तुत करता है जो 'प्रेफरलोकल' नामक बूलियन लेता है और मुझे एक प्रकार-सुरक्षित राज्य ऑब्जेक्ट से गुजरने की अनुमति देता है (इसमें एक सामान्य पैरामीटर है)

वर्तमान में अधूरा है और इस तरह दिखता है (पीढ़ी के लिए - इसे भविष्य में अपडेट किया जा सकता है):

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)
C#

public static bool QueueUserWorkItem<TState> (Action<TState> callBack, TState state, bool preferLocal);

Type Parameters TState

Parameters
callBack Action<TState>

state

preferLocal Boolean

Returns
Boolean

यह बूलियन (प्राथमिकता स्थानीय) क्या है और यह मेरे कोड को कैसे प्रभावित करेगा?

4
Jay 11 अक्टूबर 2018, 12:09

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि इसे इस पुल अनुरोध द्वारा जोड़ा गया था जो यह मुद्दा (दोनों Github लिंक, "Add ThreadPool.QueueUserWorkItem(..., bool प्राथमिकताLocal)/#14214" और "क्रमशः स्थानीय थ्रेडपूल कतार/#12442" के लिए QueueUserWorkItem जोड़ें)।

इस मुद्दे को इस प्रकार वर्णित किया गया है:

ThreadPool.QueueUserWorkItem हमेशा वैश्विक कतार में कतारबद्ध होता है; हालांकि यह अच्छा होगा कि जब थ्रेडपूल थ्रेड अतिरिक्त कार्य आइटम को कतारबद्ध करता है तो मौजूदा थ्रेडपूल थ्रेड की स्थानीय कतार में कतार में सक्षम होने का विकल्प होता है।

तर्क और उपयोग

  • जब कई धागे कतार में हों तो वैश्विक कतार में विवाद कम हो जाता है
  • कतारबद्ध कार्य आइटम पूरा होने पर संभावित रूप से अधिक स्थानीय डेटा गर्म हो जाता है
  • थ्रेडपूल के कार्य चोरी का लाभ उठाएं
  • (यानी बच्चे के कार्यों के लिए इसे करने के लिए कार्य के तर्कसंगत के समान)

मेरे लिए, यह अफ़सोस की बात है कि अप टू डेट इन-लाइन दस्तावेज़ीकरण (जिससे MSDN दस्तावेज़ उत्पन्न होता है) पुल अनुरोधों के लिए पूर्व-आवश्यकता नहीं है।


जब थ्रेड पूल पहली बार बनाया गया था, तो इसमें केवल काम की एक ही कतार थी। हालांकि, जब सभी Task अच्छाई को ढांचे में डाला जा रहा था, तो उन्होंने थ्रेड-लोकल क्यू (और कार्य चोरी) के साथ-साथ जिसे अब वैश्विक कतार का नाम दिया गया था। ऐसा लगता है कि इन कतारों तक विशिष्ट पहुंच की अनुमति देने के लिए यह साफ-सफाई का काम है।

6
Damien_The_Unbeliever 11 अक्टूबर 2018, 09:26