2015-04-09 7 views
11

यहां कुछ कोड स्निपेट हैं।क्या साझा_ptr स्वैप थ्रेड सुरक्षित है?

std::shared_ptr<int> global(new int(1)); 


void swapper(int x) 
{ 
    std::shared_ptr<int> sp(new int(x)); 
    global.swap(sp); 
} 

मान लीजिए मैं समानांतर धागे में swapper फोन करना चाहता था। क्या वह थ्रेडसेफ होगा?

मुझे इस answer से अवगत है। यह दिखाता है कि अगर मैं global पर मान को पुन: असाइन करता हूं तो पॉइंटर को असाइन करना थ्रेड सुरक्षित नहीं है।

मेरा प्रश्न यह है कि swap सदस्य फ़ंक्शन स्वयं थ्रेड सुरक्षित है।

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

वहां कनेक्शन क्या है? swap धागा सुरक्षित है?

+0

'स्वैप' को संबोधित किए बिना, यह फ़ंक्शन शायद 'global.reset (नया int (x)) जैसा दिखना चाहिए। – Barry

+1

@ बैरी: अगर आप इसे थ्रेड-सुरक्षित नहीं चाहते हैं। –

उत्तर

16

नहीं है, swap सुरक्षित थ्रेड नहीं है, लेकिन वहाँ एक और समारोह है कि है:

atomic_store(&global, sp); 

वहाँ भी atomic_exchange जो पुराने मान देता है, अगर आपको लगता है कि जरूरत है।

+0

['atomic_exchange'] (http://en.cppreference.com/w/cpp/atomic/atomic_exchange)? लेकिन हम 'shared_ptr' से निपट रहे हैं। – Barry

+5

@ बैरी: नहीं, ['atomic_exchange'] (http://en.cppreference.com/w/cpp/memory/shared_ptr/atomic)। –

+0

इससे रास्ता और समझ में आता है! – Barry

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