2012-01-24 7 views
5

पॉज़िक्स थ्रेडिंग पर पढ़ते समय, मैं थ्रेड-विशिष्ट-डेटा के उदाहरण में आया। मेरे दिमाग में भ्रम की स्थिति के एक क्षेत्र ...थ्रेड-विशिष्ट डेटा - मैं थ्रेड आईडी के साथ एक स्थिर मानचित्र का उपयोग क्यों नहीं कर सकता?

धागा विशेष-डेटा इंटरफेस एक छोटे से भद्दा लग रहा है, विशेष रूप से आप एक बार pthread_once, विभिन्न initializers उपयोग करने के लिए होने में मिश्रण, आदि

है किया वहाँ कोई कारण नहीं है कि मैं केवल एक स्थिर std :: मानचित्र का उपयोग नहीं कर सकता जहां कुंजी pthread_self() आईडी है और डेटा मान std :: जोड़ी के दूसरे भाग में आयोजित किया जाता है?

मैं इस कारण से नहीं सोच सकता कि यह एक म्यूटेक्स में लपेटा गया है, लेकिन मुझे इसका कोई सुझाव नहीं दिखता है या ऐसा कुछ भी जो मुझे भ्रमित करता है, यह प्रदान की गई API से कहीं अधिक आसान लगता है । मुझे पता है कि थ्रेडिंग में कैच -22 का बहुत कुछ हो सकता है, इसलिए मैंने सोचा कि मैं पूछूंगा और देख सकता हूं कि मैं कदम उठाने वाला था ... कुछ अप्रिय? :)

उत्तर

5

मैं एक कारण यह है कि यह एक म्युटेक्स में जब तक यह लपेटा गया था काम नहीं होता नहीं सोच सकते हैं

कि अपने आप में एक बहुत अच्छा कारण है; ठीक से कार्यान्वित किया गया है, आप अपने थ्रेड-विशिष्ट डेटा तक बिना अन्य थ्रेड को एक साथ बनाने या एक्सेस करने से रोक सकते हैं।

वहाँ भी सामान्य दक्षता (निरंतर समय का उपयोग, बनाम लघुगणक समय अगर आप std::map का उपयोग करें) है, कोई गारंटी नहीं pthread_t सभी अन्य धागा संसाधनों के साथ एक उपयुक्त आदेश परिभाषित है, और स्वत: सफाई है।

यदि आप पॉज़िक्स एपीआई पसंद नहीं करते हैं तो आप सी ++ 11 के thread_local कीवर्ड, या boost::thread_specific_ptr का उपयोग कर सकते हैं।

+0

+1 नहीं, सी ++ 11 कीवर्ड के लिए धन्यवाद, मैं उन लोगों का उपयोग करने का आनंद उठाउंगा जब मैं इसे समर्थन देने वाली परियोजना पर प्राप्त करता हूं :) –

3
  1. pthread धागा विशेष-डेटा मानक पुस्तकालय कंटेनर
  2. धागा विशेष-डेटा ताला लगा की जरूरत से बचा जाता है से पहले से ही अस्तित्व में है और यकीन है कि डेटा
  3. डेटा साफ किया जाता है के साथ कोई अन्य धागा भोजनालयों में आता है जब थ्रेड गायब हो जाता है

ऐसा कहकर, कुछ भी आपको अपने स्वयं के समाधान का उपयोग करने से रोकता है। यदि आप सुनिश्चित कर सकते हैं कि किसी भी धागे चलने से पहले कंटेनर पूरी तरह से बनाया गया है (स्थिर थ्रेडिंग मॉडल), तो आपको म्यूटेक्स की भी आवश्यकता नहीं है।

+0

इसके अलावा, pthread एक सी एपीआई है, सी ++ – nos