2012-06-12 9 views
18

के अंदर थ्रेड स्थानीय चर का उपयोग कर सकते हैं।क्या आप कक्षा या संरचना

struct some_struct 
{ 
// Other fields 
..... 
__thread int tl; 
} 

मैं ऐसा करने की कोशिश कर रहा हूं लेकिन संकलक मुझे यह त्रुटि दे रहा है।

./cv.h:16:2: error: '__thread' is only allowed on variable declarations 
     __thread int tl; 
+1

करने के लिए __thread int tl; में बदल दें संकलक त्रुटि आपको मिलने वाला पोस्ट करना चाहिए। –

+0

AFAICS '__thread' मानक नहीं है। आप किस कंपाइलर का उपयोग कर रहे हैं? –

उत्तर

12

थ्रेड-स्थानीय संग्रहण केवल स्थैतिक चर पर लागू होता है। गैर स्थैतिक संरचना या कक्षा के सदस्यों को धागा-स्थानीय बनाने में कोई बात नहीं है।

स्थानीय (स्वचालित) चर हमेशा थ्रेड के लिए विशिष्ट होते हैं जो कोड निष्पादित करते हैं, लेकिन डेटा या बीएसएस सेगमेंट में रहने के बाद वैश्विक और स्थैतिक चर को थ्रेड के बीच साझा किया जाता है। टीएलएस उन ग्लोबल वैरिएबल को थ्रेड में स्थानीय बनाने के लिए एक तंत्र प्रदान करता है और यही __thread कीवर्ड प्राप्त करता है - यह प्रत्येक थ्रेड में चर की एक अलग प्रतिलिपि बनाने के लिए कंपाइलर को निर्देश देता है जबकि यह एक वैश्विक रूप से बना रहता है (उदाहरण के लिए इसे एक्सेस किया जा सकता है निष्पादन के समान धागे के भीतर बुलाए गए विभिन्न कार्यों)। स्टैक पर या तो अगर एक स्वत: चर घोषित किया जाता है या ढेर में new या malloc() प्रयोग किया जाता है -

गैर स्थिर वर्ग के सदस्यों और संरचना सदस्यों को एक ही जगह है जहाँ वस्तु (वर्ग या संरचना) आवंटित किया जाता है में रखा जाता है। किसी भी तरह से प्रत्येक थ्रेड को चर के लिए एक अद्वितीय संग्रहण स्थान प्राप्त होता है और __thread इस मामले में लागू नहीं है, इसलिए आपको प्राप्त होने वाली संकलक त्रुटि।

+6

__thread या thread_local के वर्तमान अर्थ के साथ नहीं, लेकिन कुछ स्थितियां हैं जहां प्रत्येक थ्रेड के लिए एक अलग सदस्य होने का अर्थ होता है, कुछ इंटरफ़ेस के पीछे अच्छी तरह से लपेटा जाता है। – PlasmaHH

+9

मुझे असहमत होना है - सिर्फ इसलिए कि एक ऑब्जेक्ट को एक थ्रेड द्वारा बनाया गया है इसका मतलब यह नहीं है कि इसे पूरी तरह से एक थ्रेड (जैसे लॉक-फ्री डेटा स्ट्रक्चर) द्वारा छेड़छाड़ की जाएगी। माना जाता है कि, यह अपेक्षाकृत दुर्लभ है। – Cameron

+0

मैं सराहना करता हूं कि डाउनवॉटर किसी भी कॉन्ट्रैक्ट-उदाहरण या बेहतर उत्तर पोस्ट करने या प्रश्न को संपादित करने या प्रश्न को संपादित करने के सुझावों के बारे में सुझाव प्रदान करेगा। –

6

gcc लगाता __thread के उपयोग पर निम्नलिखित restrictions:

__thread विनिर्देशक किसी भी वैश्विक, फ़ाइल-दायरे वाले स्थिर, समारोह-दायरे वाले स्थिर, या स्थिर डेटा एक के सदस्य के लिए लागू किया जा सकता है कक्षा। यह ब्लॉक-स्कोप्ड स्वचालित या गैर स्थैतिक डेटा सदस्य पर लागू नहीं किया जा सकता है।

__thread संशोधक एकाधिक कंपाइलर द्वारा समर्थित है। यह अकल्पनीय नहीं है कि सटीक प्रतिबंध कुछ हद तक कंपाइलर से कंपाइलर में भिन्न होते हैं।

0

पुरानी पेटज़ोल्ड पुस्तक 'प्रोग्रामिंग विंडोज' (पृष्ठ 1241) के अनुसार आप कीवर्ड का उपयोग करके थ्रेड लोकल के रूप में एक चर को चिह्नित करते हैं: __declspec (thread)। तो उदाहरण के लिए: __declspec (थ्रेड) int iGlobal = 1;

मुझे संदेह है कि यह कक्षा में किया जा सकता है। आप वैरिएबल स्थिर भी बना सकते हैं। [संपादित करें] बस एहसास हुआ कि आप शायद विंडोज़ पर नहीं चल रहे हैं ... तो मुझे लगता है कि किसी भी व्यक्ति के लिए जो विंडोज़ उत्तर की जरूरत है, यह प्रासंगिक हो सकता है।

4

C11 मानक धारा 6.7.1 पैरा 2

अधिक से अधिक, एक भंडारण-वर्ग विनिर्देशक है, एक घोषणा में घोषणा विनिर्देशक में दी जा सकती है, सिवाय इसके कि _Thread_local स्थिर या निर्वासन के साथ दिखाई दे सकते हैं। 120)

सी 11 मानक धारा 6.7।1 पैराग्राफ़ 3

ब्लॉक गुंजाइश के साथ एक वस्तु की घोषणा में, यदि घोषणा विनिर्देशक _Thread_local में शामिल हैं, वे भी या तो स्थिर है या निर्वासन में शामिल होगा। यदि किसी ऑब्जेक्ट की किसी भी घोषणा में _Thread_local प्रकट होता है, तो वह उस ऑब्जेक्ट की घोषणा प्रत्येक में मौजूद होगा।

+1

मुझे लगता है कि आपका मतलब सी 11 है, नहीं? सी 99 में धागा मॉडल नहीं था और वह सब कुछ था। –

+0

सुधारित। सी 99 लिखने की आदत। – phoxis

0

सी के लिए यह बहुत समझ में नहीं आता है, static (= वैश्विक) सदस्य केवल सी ++ की एक विशेषता हैं। और इसलिए नया सी 11 मानक (जो _Thread_local पेश करता है) इसकी अनुमति नहीं देता है। इन जानवरों को मूल रूप से हर जगह स्थिर आवृत्ति अवधि के साथ एक परिवर्तनीय अनुमति दी जाती है।

सी ++ के लिए यह static सदस्य के समान वर्ग के भीतर समझ में आ सकता है, लेकिन यदि सी ++ 11 द्वारा इसकी अनुमति है तो मुझे कोई जानकारी नहीं है।

+0

यह प्रतीत नहीं होता है, मुझे V272015 के साथ C2720 मिला है: https://msdn.microsoft.com/en-us/library/w8x1t4f0.aspx –

1

आप thread_local static int tl;

+1

तब आपके पास अलग-अलग मान वाले संरचना/वर्ग के कई उदाहरण नहीं हो सकते हैं यह क्षेत्र। – rustyx

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