2011-06-11 10 views
8

मेरा प्रश्न है कि थ्रेड फ़ंक्शन में केवल स्थानीय चर के बजाय टीएलएस तंत्र का उपयोग क्यों करें? क्या आप कृपया कुछ अच्छा उदाहरण प्रदान कर सकते हैं, या स्थानीय वार्स पर टीएलएस का क्या फायदा है? धन्यवाद, मैट्यूज़स्थानीय चर के बजाय थ्रेड लोकल स्टोरेज (TlsAlloc, TlsGetValue, ets) का उपयोग क्यों करें

उत्तर

4

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

+0

का उल्लेख किया जब मेरे पास थ्रेड फ़ंक्शन से कई फ़ंक्शन हैं और वे सभी एक ही डेटा का उपयोग करते हैं तो मैं टीएलएस का उपयोग केवल स्टैक के माध्यम से डेटा को पास नहीं करने के लिए करता हूं, हां? –

+1

हां। उदाहरण के लिए, यदि लॉग इन उपयोगकर्ता को जानने के लिए कोड में विभिन्न बिंदुओं पर इसकी आवश्यकता होती है, तो लॉग इन उपयोगकर्ता को हर विधि में पास करने के बजाय उस जानकारी को सिंगलटन में टीएलएस में स्टोर करना आसान होता है। – btreat

+1

आपकी समझ सही है लेकिन ढेर पर पार्सिंग बेहतर है –

1

थ्रेड-स्थानीय भंडारण का उपयोग प्रति-थ्रेड आधार पर वैश्विक या स्थैतिक चर को अनुकरण करने के लिए किया जा सकता है। "सामान्य" स्थानीय चर नहीं कर सकते हैं।

+1

और यह मुझे वैश्विक चर के लिए क्या देता है जो थ्रेड विशिष्ट है? –

+0

यह एफई दे सकता है। मिशमाशरू ने – str14821

7

यदि आप स्थानीय चर का उपयोग कर सकते हैं तो ऐसा करें और आप हमेशा स्थानीय लोगों का उपयोग कर सकते हैं। केवल अंतिम उपाय के रूप में आप थ्रेड स्थानीय भंडारण का उपयोग करना चाहिए जो वैश्विक चर के रूप में लगभग सभी नुकसान से पीड़ित है। यद्यपि आप थ्रेड स्थानीय भंडारण का उपयोग करने का कोई कारण ढूंढ रहे हैं, वास्तव में सर्वोत्तम अभ्यास यह है कि इससे बचने के तरीकों की खोज करें! https://software.intel.com/en-us/articles/use-thread-local-storage-to-reduce-synchronization

3

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

+1

मैंने इस पोस्ट को छोड़ दिया लेकिन बाद में इस लेख को पढ़ा। बुरा कदम, अच्छा लेख! – Seralize

2

मैं TLS का उपयोग करने से एक बहुत अच्छा उदाहरण पता:

+0

अच्छा बिंदु भाई! उसे भी नहीं पता था। – str14821

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