5

मेरे पास सी ++ 11 कोड का निम्न बिट है जो धागे और स्थैतिक परिवर्तनीय प्रारंभिकरण का उपयोग करता है। मेरा सवाल है:सी ++ स्थैतिक परिवर्तनीय inialization और धागे

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

#include <iostream> 
#include <thread> 

class theclass 
{ 
public: 
    theclass(const int& n) 
    :n_(n) 
    { printf("aclass(const int& n){}\n"); } 
    int n() const { return n_; } 
private: 
    int n_; 
}; 

int operator+(const theclass& c, int n) 
{ 
    return c.n() + n; 
} 

void foo() 
{ 
    static theclass x = 1; 
    static theclass y = x + 1; 
    printf("%d %d\n",x.n(),y.n()); 
} 

int main() 
{ 
    std::thread t1(&foo); 
    std::thread t2(&foo); 
    t1.join(); 
    t2.join(); 
    return 0; 
} 

उत्तर

8

कोड जो आप उम्मीद करेंगे वह करेगा। देखें §6.7.4

स्थिर स्थानीय चर हैं:

... प्रारंभ पहली बार नियंत्रण अपनी घोषणा के ऊपर से गुजरता ... नियंत्रण समवर्ती घोषणा में प्रवेश करती है, जबकि चर प्रारंभ किया जा रहा है, समवर्ती निष्पादन प्रारंभ होने के को पूरा करने के लिए प्रतीक्षा करेगा।

दूसरे शब्दों में संकलक सुनिश्चित करता है कि आपके थ्रेड स्थिर स्थानीय लोगों के प्रारंभ में सहयोग करते हैं। वे प्रत्येक को एक बार शुरू किया जाएगा और प्रत्येक थ्रेड को पूरी तरह से प्रारंभ होने के बाद ही ऑब्जेक्ट तक पहुंच होगी।

संकलक केवल thread_local कीवर्ड के साथ स्पष्ट रूप से अनुरोध करते समय केवल एक थ्रेड स्थानीय चर बना देगा।

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