2009-08-27 15 views
6

सी में, वैश्विक दायरे में एक परिवर्तनीय स्थैतिक घोषित करने से यह एक वैश्विक चर बन जाता है। क्या यह वैश्विक चर धागे के बीच साझा किया गया है या क्या यह प्रति थ्रेड आवंटित है?सी वैश्विक स्थैतिक - धागे के बीच साझा किया?

अद्यतन: /गैर साझा वे धागे के बीच साझा कर रहे हैं, एक आसान तरीका एक पहले से मौजूद पुस्तकालय एक धागा करने के लिए अद्वितीय में वैश्विक बनाने के लिए क्या है?

अद्यतन 2: असल में, मुझे थ्रेड-सुरक्षित तरीके से ग्लोबल्स के साथ एक पूर्ववर्ती सी लाइब्रेरी का उपयोग करने की आवश्यकता है।

+4

एक परिवर्तनीय स्थैतिक घोषित करने से यह फ़ाइल स्कोप चर बन जाता है। इसे गैर स्थैतिक घोषित करना इसे वैश्विक बनाता है। –

+0

उस स्पष्टीकरण के लिए धन्यवाद। – jameszhao00

+0

आप किस ओएस का उपयोग करते हैं? मुझे लगता है कि अद्यतन 2 के लिए मंच विशिष्ट समाधान हो सकता है। –

उत्तर

16

यह पूरी प्रक्रिया के लिए दृश्यमान है, यानी सभी धागे। बेशक, यह अभ्यास में है। सिद्धांत रूप में, आप यह नहीं कह सकते थे क्योंकि धागे के पास सी मानक के साथ कुछ लेना देना नहीं है (कम से कम सी 99 तक, जो मानक है जो इस सवाल से पूछा गया था)।

लेकिन मेरे द्वारा उपयोग किए जाने वाले सभी थ्रेड पुस्तकालयों में सभी धागे के लिए ग्लोबल्स पहुंच योग्य होंगे।


अद्यतन 1:

कई धागा पुस्तकालयों (pthreads, के लिए एक) आप एक साधन धागा-विशिष्ट डेटा बनाने के लिए, कार्य बना सकते हैं और बिना धागे के लिए विशिष्ट डेटा का उपयोग करने के लिए अनुमति देगा यह समारोह के माध्यम से पारित किया।

तो, उदाहरण के लिए, छद्म यादृच्छिक संख्याओं को वापस करने के लिए एक फ़ंक्शन प्रत्येक थ्रेड को एक स्वतंत्र बीज प्राप्त करना चाह सकता है। इसलिए प्रत्येक बार इसे इसे बुलाया जाता है या तो उस बीज को पकड़ने वाले थ्रेड-विशिष्ट ब्लॉक को बनाता है या जोड़ता है (किसी प्रकार की कुंजी का उपयोग करके)।

यह फ़ंक्शंस को गैर-थ्रेडेड वाले (यदि वे उदाहरण के लिए आईएसओ सी फ़ंक्शन हैं) के समान हस्ताक्षर बनाए रखने की अनुमति देता है क्योंकि अन्य समाधान में फंक्शन कॉल में थ्रेड-विशिष्ट पॉइंटर जोड़ना शामिल है।

int fDone[10]; 
int idx; 
: : : 
for (i = 0; i < 10; i++) { 
    idx = i; 
    startThread (function, i); 
    while (idx >= 0) 
     yield(); 
} 

void function() { 
    int myIdx = idx; 
    idx = -1; 
    while (1) { 
     : : : 
    } 
} 

यह धागा समारोह कही जाने वाली जो सरणी में वैश्विक चर यह के अंतर्गत आता है की अनुमति होगी:

एक और संभावना है जैसे वैश्विक जिनमें से प्रत्येक धागा एक हो जाता है, की एक सरणी है ।

अन्य विधियां हैं, इसमें कोई संदेह नहीं है, लेकिन आपके लक्षित माहौल को जानने से कम, उनके बारे में चर्चा करने में कोई बात नहीं है।


अद्यतन 2:

सबसे आसान तरीका एक थ्रेडेड वातावरण में एक गैर धागा सुरक्षित पुस्तकालय का उपयोग करने के म्युटेक्स संरक्षण के साथ आवरण कॉल प्रदान करना है।

उदाहरण के लिए, कहें कि आपकी लाइब्रेरी में गैर-थ्रेड-सुरक्षित doThis() फ़ंक्शन है।

void myDoThis (a, b) { 
    static mutex_t serialize; 
    mutex_claim (&serialize); 
    doThis (a, b); 
    mutex_release (&serialize); 
} 

क्या होगा यह है कि एक समय में केवल एक धागा म्युटेक्स दावा करने के लिए (और इसलिए गैर धागा सुरक्षित समारोह कहते हैं) में सक्षम हो जाएगा: तुम क्या इसके लिए एक आवरण प्रदान करना है। अन्य मौजूदा रिटर्न तक अवरुद्ध हो जाएंगे।

+0

धन्यवाद। अद्यतन सवाल थोड़ा सा। – jameszhao00

+0

क्षमा करें। फिर से अपडेट किया गया ... – jameszhao00

+0

ठीक है, जेम्स, मुझे लगता है कि मैं अभी तक रख रहा हूं :-) – paxdiablo

1

सी/सी ++ मानक थ्रेड का समर्थन नहीं करता है। तो सभी चर धागे के बीच साझा किया। सी/सी ++ रनटाइम लाइब्रेरी में लागू थ्रेड समर्थन जो मानक का हिस्सा नहीं है। रनटाइम सी/सी ++ के प्रत्येक कार्यान्वयन के लिए विशिष्ट है। यदि आप सी ++ में पोर्टेबल कोड लिखना चाहते हैं तो आप boost interprocess library का उपयोग कर सकते हैं।

माइक्रोसॉफ्ट विजुअल स्टूडियो में थ्रेड स्थानीय चर घोषित करने के लिए आप माइक्रोसॉफ़्ट विशिष्ट कीवर्ड __declspec(thread) का उपयोग कर सकते हैं।

1

जैसा कि @ पैक्स का उल्लेख है, सभी धागे के लिए स्थैतिक चर दिखाई दे रहे हैं। किसी विशेष धागे से जुड़े कोई सी ++ डेटा निर्माण नहीं है।

हालांकि, विंडोज़ पर आप थ्रेड-विशिष्ट डेटा के लिए इंडेक्स आवंटित करने के लिए TlsAlloc एपीआई का उपयोग कर सकते हैं और उस इंडेक्स को स्थिर चर में डाल सकते हैं। प्रत्येक थ्रेड का अपना स्लॉट होता है जिसे आप इस अनुक्रमणिका और TlsGetValue और TlsSetValue का उपयोग करके एक्सेस कर सकते हैं। अधिक जानकारी के लिए, एमएसडीएन पर Using Thread Local Storage पढ़ें।

अद्यतन: एक पूर्ववर्ती पुस्तकालय में ग्लोबल्स को थ्रेड-विशिष्ट होने का कोई तरीका नहीं है। किसी भी समाधान के लिए आपको कोड को संशोधित करने की आवश्यकता होगी और यह भी पता होना चाहिए कि डेटा में थ्रेड एफ़िनिटी है।

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