क्या सी ++ 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 :: परमाणु घोषणा मेरे लिए संकलित करती है, लेकिन मुझे नहीं पता कि इसे कैसे प्रारंभ किया जाए और आगे बढ़ें।
std :: shared_ptr के उत्तर और चर्चा के लिए धन्यवाद। इरादे के लिए: कोड सरलीकृत है, लेकिन मुझे लगता है कि यह भी बाद में धागे को वापस लौटाएगा ताकि कॉलर को पता चल सके कि टोकन उपलब्ध नहीं है। यहां हल की गई समस्या मैं अन्य टिप्पणी में समझाऊंगा। –
ग्राहक डेटामैनेजर पर दो प्रकार के संचालन करते हैं: पढ़ना, लिखना। उस समय केवल एक ग्राहक ही लिख सकता है। ** ग्राहक धागे नहीं हैं ** - कभी-कभी हां, कभी-कभी क्लाइंट के लिए बैकग्राउंड जॉब लॉन्च किया जा सकता है। पढ़ने/लिखने का मतलब सरल ऑपरेशन नहीं है बल्कि डेटामैनेजर और क्लाइंट के बीच एक जटिल संचार प्रोटोकॉल का पालन करना है। टोकन उपलब्ध होने तक ग्राहक अनुरोधों को अवरुद्ध नहीं किया जाना चाहिए, लेकिन कभी-कभी सक्रिय रूप से इनकार कर दिया जाता है। गड़बड़ी में उन्मुख करने के लिए मैंने इस सिंकटोकन का प्रस्ताव दिया - लेखक को सिंकोकोकन उधार लेने की आवश्यकता है और समाप्त होने पर वापसी SyncToken (unique_ptr) को कॉल करने की आवश्यकता है। –