थ्रेड लोकल स्टोरेज स्टैटिक है लेकिन यह सिंपल स्टैटिक स्टोरेज से काफी अलग है।
जब आप एक चर स्थैतिक की घोषणा करते हैं तो चर का एक उदाहरण होता है। कंपाइलर / रनटाइम सिस्टम गारंटी देता है कि यह आपके लिए वास्तव में उपयोग करने से पहले कुछ समय के लिए निर्दिष्ट किया जाएगा, जब वास्तव में निर्दिष्ट किए बिना (कुछ विवरण यहां छोड़ा गया है।)
C ++ 11 गारंटी देता है कि यह प्रारंभ थ्रेड सुरक्षित होगा, हालांकि C ++ 11 से पहले इस थ्रेड सुरक्षा की गारंटी नहीं थी। उदाहरण के लिए
static X * pointer = new X;
यदि एक ही समय में एक से अधिक स्टैटिक इनिशियलाइज़ेशन कोड हिट हो तो X के इंस्टेंस लीक हो सकते हैं।
जब आप एक वैरिएबल थ्रेड को स्थानीय घोषित करते हैं, तो वैरिएबल के कई उदाहरण हैं। आप उन्हें एक मानचित्र में होने के बारे में सोच सकते हैं जिसे थ्रेड-आईडी द्वारा अनुक्रमित किया गया था। इसका अर्थ है कि प्रत्येक थ्रेड चर की अपनी प्रति देखता है।
एक बार फिर, यदि वैरिएबल को इनिशियलाइज़ किया जाता है तो कंपाइलर / रनटाइम सिस्टम यह गारंटी देता है कि यह इनिशियलाइज़ेशन डेटा के उपयोग से पहले होगा और यह कि वैरिएशन वेरिएबल का उपयोग करने वाले प्रत्येक थ्रेड के लिए होगा। संकलक भी गारंटी देता है कि दीक्षा थ्रेड सुरक्षित होगी।
थ्रेड सेफ्टी गारंटी का मतलब है कि वेरिएबल को व्यवहार में लाने के लिए काफी हद तक पीछे-पीछे का कोड हो सकता है जिससे आप इसकी अपेक्षा करते हैं - विशेष रूप से यह देखते हुए कि कंपाइलर के पास समय से पहले जानने का कोई तरीका नहीं है कि कितने धागे होंगे आपके प्रोग्राम में मौजूद है और इनमें से कितने थ्रेड स्थानीय चर को स्पर्श करेंगे।
thread_local
स्थानीय चर होने से कोई मतलब नहीं है ... प्रत्येक थ्रेड का अपना कॉल स्टैक होता है।