2012-12-13 16 views
5

क्या सी ++ 11 परमाणु संचालन के साथ सुरक्षित_ptr को सुरक्षित रूप से स्थानांतरित करना संभव है?थ्रेड सुरक्षित unique_ptr move

std::atomic<std::unique_ptr<SyncToken>> syncToken; 

और म्युटेक्स की जरूरत से परहेज:

वर्तमान में मैं मैं सोच इस

std::unique_ptr<SyncToken> DataManager::borrowSyncToken() 
{ 
    std::unique_lock<std::mutex> syncTokenLock(syncTokenMutex); 
    return std::move(syncToken); 
} 

की तरह एक कोड हूँ कुछ और सुरुचिपूर्ण तरीका है कि क्या वहाँ, बस की घोषणा की तरह है। या संभवतः मुझे यहां लॉक के बारे में परवाह करने की आवश्यकता नहीं है और std :: move पहले से ही परमाणु है?

अनुसंधान के बाद मैं अब तक मुझे लगता है बनाया:

  • std :: ही ले जाने के परमाणु नहीं है और कुछ समन्वयन के आसपास अन्यथा 2 धागे मेरी विधि समवर्ती बुला 2 प्रतियों के साथ खत्म हो सकता है की जरूरत है कुछ अपरिभाषित पॉइंटर्स के।
  • std :: परमाणु घोषणा मेरे लिए संकलित करती है, लेकिन मुझे नहीं पता कि इसे कैसे प्रारंभ किया जाए और आगे बढ़ें।

उत्तर

2

नहीं, यह संभव नहीं है।

मूल्य T जो आप std::atomic पर पास करते हैं, उसे तुलनीय रूप से प्रतिलिपि बनाने की आवश्यकता है, जो std::unique_ptr नहीं है। std::atomic::load या std::atomic::store जैसे ऑपरेशंस मूल्यों से टी ऑब्जेक्ट्स लेते हैं।

std::atomic में कुछ पैकिंग भी मूल्य परमाणु से संचालन नहीं करता है।

परमाणु संदर्भ में std::unique_ptr का उपयोग करते समय, आपको इस तथ्य के बारे में सोचना होगा कि संसाधनों के प्रबंधन की स्थिति में आपको समस्या हो सकती है। आप कभी नहीं जानते कि कितने धागे अभी भी आपके डेटा का संदर्भ लेते हैं, इस समस्या को std::shared_ptr के साथ हल किया जा सकता है जो परमाणु संदर्भ गणना का उपयोग करता है। (आपको यह जांचने की ज़रूरत है कि std::atomic_is_lock_free फ़ंक्शन का उपयोग करके यह वास्तव में परमाणु है या नहीं।)

एक बात मैं आपके कोड को देखने पर भी ठोकर खा रहा था borrowSyncToken फ़ंक्शन का इरादा है। इसे उधार कहा जाता है लेकिन आप std::unique_ptr को स्थानांतरित करके कॉलर को टोकन के स्वामित्व को पास करते हैं, स्वामित्व वापस कैसे पारित किया जाता है और डेटामैनेजर वर्तमान में टोकन का मालिक नहीं होने पर अन्य धागे क्या प्राप्त करते हैं?

+0

std :: shared_ptr के उत्तर और चर्चा के लिए धन्यवाद। इरादे के लिए: कोड सरलीकृत है, लेकिन मुझे लगता है कि यह भी बाद में धागे को वापस लौटाएगा ताकि कॉलर को पता चल सके कि टोकन उपलब्ध नहीं है। यहां हल की गई समस्या मैं अन्य टिप्पणी में समझाऊंगा। –

+0

ग्राहक डेटामैनेजर पर दो प्रकार के संचालन करते हैं: पढ़ना, लिखना। उस समय केवल एक ग्राहक ही लिख सकता है। ** ग्राहक धागे नहीं हैं ** - कभी-कभी हां, कभी-कभी क्लाइंट के लिए बैकग्राउंड जॉब लॉन्च किया जा सकता है। पढ़ने/लिखने का मतलब सरल ऑपरेशन नहीं है बल्कि डेटामैनेजर और क्लाइंट के बीच एक जटिल संचार प्रोटोकॉल का पालन करना है। टोकन उपलब्ध होने तक ग्राहक अनुरोधों को अवरुद्ध नहीं किया जाना चाहिए, लेकिन कभी-कभी सक्रिय रूप से इनकार कर दिया जाता है। गड़बड़ी में उन्मुख करने के लिए मैंने इस सिंकटोकन का प्रस्ताव दिया - लेखक को सिंकोकोकन उधार लेने की आवश्यकता है और समाप्त होने पर वापसी SyncToken (unique_ptr ) को कॉल करने की आवश्यकता है। –

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