2009-12-01 10 views
9

मैंने कई स्थानों पर पढ़ा है जो Boost.Signals थ्रेडसेफ नहीं है लेकिन मुझे इसके बारे में अधिक जानकारी नहीं मिली है। यह सरल उद्धरण वास्तव में इतना नहीं कहता है। अधिकांश अनुप्रयोगों में आजकल धागे होते हैं - भले ही वे सिंगल थ्रेडेड होने का प्रयास करते हैं, फिर भी उनके कुछ पुस्तकालय धागे का उपयोग कर सकते हैं (उदाहरण के लिए libsdl)।बूस्ट: Boost.Signals में थ्रेडसेफ वास्तव में क्या नहीं है?

मुझे लगता है कि कार्यान्वयन में स्लॉट तक नहीं पहुंचने वाले अन्य धागे के साथ समस्या नहीं है। तो यह इस अर्थ में कम से कम थ्रेडसेफ है।

लेकिन वास्तव में क्या काम करता है और क्या काम नहीं करेगा? क्या यह इसे कई धागे से उपयोग करने के लिए काम करेगा जब तक कि मैं इसे एक ही समय में कभी भी एक्सेस नहीं करता? अर्थात। अगर मैं स्लॉट के चारों ओर अपने म्यूटेक्स का निर्माण करता हूं?

या क्या मुझे केवल उस थ्रेड में स्लॉट का उपयोग करने के लिए मजबूर किया गया है जहां मैंने इसे बनाया था? या जहां मैंने पहली बार इसका इस्तेमाल किया था?

+0

यह थोड़ी देर हो गया है ... क्या इसका मेरा जवाब समझ में आया? असल में सिग्नल लाइब्रेरी * स्वयं * किसी भी थ्रेड से आपके द्वारा किए गए कॉलों के बावजूद क्रैश नहीं होगा जब तक कि वे "मान्य" हों ... लेकिन आप अपने कोड में अर्थशास्त्र के लिए ज़िम्मेदार हैं। – HostileFork

+0

हाँ यह समझ में आता है लेकिन यह वास्तव में मेरे सभी सवालों का जवाब नहीं देता है। :) मूल रूप से आपने कहा "स्रोत में इसे देखो"। मैं इसे बाद के बिंदु पर करूँगा और उसके बाद मेरे सवालों के सभी सटीक उत्तर पोस्ट करूंगा। – Albert

+0

आपने पूछा "वास्तव में क्या काम करता है और क्या काम नहीं करेगा?" मैंने महसूस किया कि आपके संक्षिप्त विशिष्ट प्रश्नों को विच्छेदन करने से कहीं अधिक आवश्यक था।(वे उत्तर हैं "हां: यदि आप एक म्यूटेक्स के साथ सावधान हैं जो ठीक है, लेकिन संभवतः अनावश्यक है यदि आपके स्लॉट के अर्थशास्त्र ऐसे हैं कि एक से अधिक थ्रेड एक समय में चल रहे हैं; यह किसी भी अन्य फ़ंक्शन को कई धागे से कॉल करने जैसा है" और "नहीं: आप केवल उन धागे में स्लॉट का उपयोग करने के लिए प्रतिबंधित नहीं हैं जहां वे बनाए गए हैं।") – HostileFork

उत्तर

5

मैं इसे या तो बहुत स्पष्ट है नहीं लगता है, और पुस्तकालय समीक्षक said here में से एक:

मैं भी सच है कि केवल तीन बार शब्द 'धागा' नामित किया गया था और पसंद किया है। Boost.signals2 एक 'थ्रेड सुरक्षित सिग्नल' लाइब्रेरी बनना चाहता है। इसलिए कुछ और विवरण और उस क्षेत्र से संबंधित विशेष रूप से अधिक उदाहरण उपयोगकर्ता को पर दिए जाने चाहिए।

इसे निकालने का एक तरीका go to the source है और देखें कि वे सुरक्षा के लिए _mutex/lock() का उपयोग कर रहे हैं। तो बस कल्पना करें कि क्या होगा यदि उन कॉल नहीं थे। :)

जो मैं इकट्ठा कर सकता हूं, उससे सरल चीजें सुनिश्चित हो रही हैं जैसे "अगर एक धागा कनेक्ट हो रहा है या डिस्कनेक्ट हो रहा है, जो एक अलग थ्रेड का कारण नहीं बनता है जो क्रैश करने के लिए उन संकेतों से जुड़े स्लॉट के माध्यम से पुनरावृत्ति कर रहा है"। सी रनटाइम लाइब्रेरी के थ्रेड-सुरक्षित संस्करण का उपयोग करने की तरह यह आश्वासन देता है कि यदि दो थ्रेड एक ही समय में printf पर वैध कॉल करते हैं तो कोई क्रैश नहीं होगा। (नहीं कहने के लिए उत्पादन आप कोई मतलब भी मिलेंगी — आप अभी भी उच्च आदेश अर्थ विज्ञान के लिए उत्तरदायी हैं।)

यह क्यूटी की तरह बनना है, जो सूत्र में एक निश्चित स्लॉट के प्रतीत नहीं होता कोड चल रहा है लक्ष्य स्लॉट के "थ्रेड एफ़िनिटी" पर आधारित है (जिसका मतलब है कि एक सिग्नल उत्सर्जित करना समानांतर में चलाने के लिए कई अलग-अलग धागे पर स्लॉट ट्रिगर कर सकता है।) लेकिन मुझे लगता है कि समर्थन नहीं है इसलिए बूस्ट :: सिग्नल "संयोजक" do things like this

0

एक समस्या जो मैं देखता हूं वह यह है कि एक धागा कनेक्ट हो सकता है या डिस्कनेक्ट हो सकता है जबकि एक और थ्रेड सिग्नलिंग हो रहा है।

आप आसानी से अपने सिग्नल को लपेट सकते हैं और म्यूटेक्स के साथ कॉल कनेक्ट कर सकते हैं। हालांकि, कनेक्शन को लपेटना गैर-तुच्छ है। (रिटर्न कनेक्शन कनेक्ट करें जिन्हें आप डिस्कनेक्ट करने के लिए उपयोग कर सकते हैं)।

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