2016-12-18 6 views
5

में एक विशिष्ट आईडी पैदा समारोह बनाने के लिए कोशिश कर रहा है, और इस के साथ आया था:परमाणु वेतन वृद्धि और वापसी काउंटर

std::atomic<int> id{0}; 
int create_id() { 
    id++; 
    return id.load(); 
} 

लेकिन मुझे लगता है यह संभव है कि समारोह में एक ही मूल्य दो बार, सही वापस जाने के लिए के लिए? उदाहरण के लिए, थ्रेड ए फ़ंक्शन को कॉल करता है, मान को बढ़ाता है, लेकिन फिर थ्रेड बी में आता है और मूल्य को भी बढ़ाता है, अंततः ए और बी दोनों एक ही मान वापस करते हैं।

तो mutexes का उपयोग कर, समारोह इस प्रकार दिखाई देंगे:

std::mutex mx; 
int id = 0; 
int create_id() { 
    std::lock_guard<std::mutex> lock{mx}; 
    return id++; 
} 

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

उत्तर

3

आपका दो कोड स्निपेट दो अलग अलग बातें करते हैं।

id++; 
return id.load(); 

कि कोड id बढ़ाता है, तो वृद्धिशील मान देता है।

std::lock_guard<std::mutex> lock{mx}; 
return id++; 

कि कोड मूल्य रिटर्न वेतन वृद्धि से पहले।

सही कोड क्या पहले की कोशिश करता करने के लिए ऐसा करने के लिए

return ++id; 

क्या दूसरे करता है करने के लिए सही कोड

return id++; 
है
संबंधित मुद्दे