मेरे पास एक साधारण प्रोग्राम है।
int main () {std :: atomic & lt ; bool & gt; बी = सच; ConcurrentQueue & LT; std :: स्ट्रिंग & gt; कतार; Std :: धागा धागा ([& amp;] {जबकि (बी) {ऑटो str = queue.wait_and_pop (); std :: cout & lt; & lt; * str;}}); बी = गलत; क्यू। पश ("अंत"); thread.join (); } समवर्ती प्रश्न है धागा सुरक्षित कतार का अपना स्वयं का कार्यान्वयन, wait_and_pop एक अवरुद्ध ऑपरेशन है जो std का उपयोग करता है :: condition_variable । यह प्रोग्राम सफलतापूर्वक "अंत" छापती है और बाहर निकलती है, यहां कोई समस्या नहीं है। (एक बग है कि b झूठा है जब धागा शुरू होता है जो इसे तत्काल बाहर निकलने के कारण होता है लेकिन यह यहां उपयुक्त नहीं है) लेकिन अगर मैं लपेटता हूं ये सभी एक वर्ग में
वर्ग वस्तु {सार्वजनिक: वस्तु () {b = true; धागा = std :: धागा ([यह] {जबकि (बी) {ऑटो str = queue.wait_and_pop (); std :: cout & lt; & lt; * str;}}); } ~ ऑब्जेक्ट () {b = false; क्यू। पश ("अंत"); thread.join (); } निजी: std :: atomic & lt; bool & gt; ख; Std :: धागा थ्रेड; ConcurrentQueue & LT; std :: स्ट्रिंग & gt; कतार; }; और एक फ़ंक्शन स्थिर वैरिएबल है जैसे
वस्तु & amp; Func () {स्थिर ऑब्जेक्ट ओ; वापसी ओ; } और मुख्य
int main () {वस्तु & amp; ओ = फेंक (); } अब प्रोग्राम "अंत" प्रिंट करता है, तो o के लाइन पर thread.join () । मैंने इसे झगड़ा और कोई समस्या नहीं के साथ परीक्षण किया है। यह केवल वीसी 11 में होता है ऐसा क्यों है?
हाल ही में एक ही समस्या के साथ एक धागा था, लेकिन मुझे अब यह नहीं मिल सकता है।
असल में, वी.एस. के रनटाइम लाइब्रेरी में एक गतिरोध है, जब आपके पास स्थिर जीवनकाल ऑब्जेक्ट होता है जो उसके नाशक में एक धागा समाप्त करने का प्रयास करता है।
No comments:
Post a Comment