2009-08-13 13 views
56

उदाहरण कोडक्या जीसीसी में स्थैतिक चर थ्रेड-सुरक्षित हैं?

void foo() 
{ 
    static Bar b; 
    ... 
} 

में जीसीसी साथ संकलित यह गारंटी है कि b बनाया है और एक धागे-सुरक्षित तरीके से प्रारंभ हो जाएगा?

अतिरिक्त कोड threadsafe के लिए दिनचर्या सी ++ ABI में निर्दिष्ट उपयोग करने के लिए उत्सर्जन नहीं है:

जीसीसी के आदमी पृष्ठ में, -fno-threadsafe-स्टैटिक्स कमांड लाइन विकल्प पाया स्थानीय सांख्यिकी का प्रारंभिकरण। आप पर इस विकल्प का उपयोग कोड में कोड आकार को कम कर सकते हैं को थ्रेड-सुरक्षित होने की आवश्यकता नहीं है।

  1. यह मतलब यह है, कि स्थानीय स्टैटिक्स जीसीसी के साथ डिफ़ॉल्ट रूप से धागे की सुरक्षित हैं? इसलिए स्पष्ट गार्डिंग को रखने का कोई कारण नहीं है उदा। pthread_mutex_lock/unlock के साथ?

  2. पोर्टेबल कोड कैसे लिखें - यह जांचने के लिए कि क्या कंपाइलर अपने गार्ड जोड़ देगा? या जीसीसी की इस सुविधा को बंद करना बेहतर है?

उत्तर

41
  1. नहीं, यह मतलब है कि स्थानीय static के प्रारंभ धागा सुरक्षित है।

  2. आप निश्चित रूप से इस सुविधा को सक्षम करना चाहते हैं। स्थानीय static एस का थ्रेड-सुरक्षित प्रारंभिकरण बहुत महत्वपूर्ण है। यदि आपको स्थानीय static एस पर आमतौर पर थ्रेड-सुरक्षित पहुंच की आवश्यकता है तो आपको उचित गार्ड स्वयं जोड़ना होगा।

+1

यदि आपके पास थ्रेड-सुरक्षित (स्थानीय फ़ंक्शन) पहुंच नहीं है तो थ्रेड-सुरक्षित प्रारंभिकता क्या उपयोग है? – xtofl

+10

mutex को आरंभ करने के लिए आप अन्य चरों तक पहुंच को नियंत्रित करने के लिए उपयोग करेंगे। – AProgrammer

+6

यदि आपको पोर्टेबल कोड लिखना है, तो आप फंक्शन स्टेटिक्स के थ्रेड सुरक्षित प्रारंभिक पर भरोसा नहीं कर सकते हैं। उदाहरण के लिए एमएस सी ++ ऐसा नहीं करता है। तो मैं बिंदु 2 पर असहमत हूं - यदि आप पोर्टेबल कोड लिखना चाहते हैं, तो आप इसे सुरक्षित रूप से अक्षम कर सकते हैं, लेकिन आपको फ़ंक्शन स्टेटिक्स का उपयोग नहीं करना चाहिए जहां थ्रेड सुरक्षा महत्वपूर्ण है ;-) – hirschhornsalz

5

मुझे लगता है कि

... धागा सुरक्षित प्रारंभ की स्थानीय स्टैटिक्स है कुंजी वाक्यांश।

मैंने इसे इस अर्थ के रूप में पढ़ा है कि यह केवल स्थिरता का प्रारंभिक है जो थ्रेड-सुरक्षित तरीके से किया जाएगा। सांख्यिकी का सामान्य उपयोग थ्रेड-सुरक्षित नहीं होगा।

6

यह वास्तव में आपके प्रश्नों का उत्तर तुरंत नहीं दे रहा है (Charles already did that), लेकिन मुझे लगता है कि यह this article पर एक लिंक पोस्ट करने का समय है। यह ग्लोबल्स के प्रारंभ पर प्रकाश डालता है और बहु-थ्रेडेड वातावरण में static चर का उपयोग करने का प्रयास करने वाले हर किसी द्वारा पढ़ और समझना चाहिए।

17

स्थानीय स्थैतिक प्रारंभिकरण की रक्षा के लिए जीसीसी 3.4 द्वारा उत्पन्न लॉकिंग कोड के साथ हमें गंभीर समस्याएं थीं। उस संस्करण ने वैश्विक साझा mutex का उपयोग सभी और किसी भी स्थिर प्रारंभिक सुरक्षा के लिए किया जो हमारे कोड में डेडलॉक का कारण बनता है। हमारे पास एक फ़ंक्शन के परिणामस्वरूप प्रारंभिक स्थानीय स्थैतिक चर था, जिसने एक और धागा शुरू किया, जिसने स्थानीय स्थैतिक चर बनाया।स्यूडोकोड:

voif f() 
{ 
    static int someValue = complexFunction(); 
    ... 
} 
int complexFunction() 
{ 
    start_thread(threadFunc()); 
    wait_for_some_input_from_new_thread(); 
    return input_from_new_thread; 
} 
void threadFunc() 
{ 
    static SomeClass s(); 
    ... 
} 

एकमात्र समाधान जीसीसी की इस सुविधा को अक्षम करना था। यदि आपको पोर्टेबल होने के लिए अपने कोड की आवश्यकता है, जो हमने किया है, तो आप थ्रेड सुरक्षा के लिए किसी विशेष जीसीसी संस्करण में जोड़े गए फीचर पर निर्भर नहीं रह सकते हैं। माना जाता है कि सी ++ 0x थ्रेड-सुरक्षित स्थानीय स्टेटिक्स जोड़ता है, तब तक यह गैर-मानक जादू है जो आपके कोड को पोर्टेबल बनाता है, इसलिए मैं इसके खिलाफ सलाह दे रहा हूं। यदि आप इसका उपयोग करने का निर्णय लेते हैं, तो मेरा सुझाव है कि आप यह सत्यापित करें कि आपका जीसीसी संस्करण सैंपल एप्लिकेशन लिखकर इस उद्देश्य के लिए एक वैश्विक म्यूटेक्स का उपयोग नहीं करता है। (थ्रेड-सुरक्षा की कठिनाई इस तथ्य से स्पष्ट है कि यहां तक ​​कि जीसीसी भी इसे सही नहीं कर सकता)

+1

मुझे एक बहुत ही समान स्थिति का सामना करना पड़ा है, और इसने मुझे इस प्रश्न को SO – CsTamas

+1

'स्थिर कुछ क्लास एस() पर रखा है;' एक समारोह घोषणा है –

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