पर परमाणु काउंटर मुझे बस एक पल होना चाहिए, क्योंकि यह आसान होना चाहिए लेकिन मुझे यह सही काम नहीं कर रहा है।जीसीसी
जीसीसी में परमाणु काउंटर को लागू करने का सही तरीका क्या है?
यानी मैं एक काउंटर चाहता हूं जो शून्य से 4 तक चलता है और धागा सुरक्षित है।
मैं यह कर रहा था (जो आगे एक कक्षा में लपेटा जाता है, लेकिन यहाँ नहीं)
static volatile int _count = 0;
const int limit = 4;
int get_count(){
// Create a local copy of diskid
int save_count = __sync_fetch_and_add(&_count, 1);
if (save_count >= limit){
__sync_fetch_and_and(&_count, 0); // Set it back to zero
}
return save_count;
}
लेकिन यह 1 से 1 से चल रहा है - तो 4 समावेशी शून्य करने के लिए चारों ओर।
इसे 0 - 3 से जाना चाहिए। आम तौर पर मैं एक मॉड ऑपरेटर के साथ काउंटर करता हूं लेकिन मैं नहीं जानता कि सुरक्षित तरीके से यह कैसे करें।
शायद यह संस्करण बेहतर है। क्या आप इसके साथ कोई समस्या देख सकते हैं, या एक बेहतर समाधान प्रदान कर सकते हैं।
int get_count(){
// Create a local copy of diskid
int save_count = _count;
if (save_count >= limit){
__sync_fetch_and_and(&_count, 0); // Set it back to zero
return 0;
}
return save_count;
}
असल में, मुझे यह इंगित करना चाहिए कि यह बिल्कुल महत्वपूर्ण नहीं है कि प्रत्येक थ्रेड को एक अलग मूल्य मिलता है। यदि दो थ्रेड एक ही समय में एक ही मूल्य को पढ़ने के लिए हुआ तो यह कोई समस्या नहीं होगी। लेकिन वे किसी भी समय सीमा से अधिक नहीं हो सकते हैं।
चाहे __sync_fetch_and_add "प्रति आमंत्रण पर एक परमाणु ऑपरेशन करता है" सीपीयू पर निर्भर करता है - प्रश्न में निर्दिष्ट नहीं है। यह आपकी तुलना-और-स्वैप दृष्टिकोण के अनुसार लागू किया जा सकता है, जो कि मैंने अतीत में सूर्य हार्डवेयर पर उपयोग किया है (ठीक है, मेरे पूर्व सहयोगी के कार्यान्वयन, जिसका नाम "atomic_robin" :-)) है। –
मैं निष्पादित निर्देशों की संख्या के बारे में बात नहीं कर रहा था; एक्सचेंज-एड को लागू करने के विभिन्न तरीके हैं, लेकिन वे सभी तब तक समकक्ष हैं जब तक कि वे वास्तव में केवल स्मृति ("प्रतिबद्ध") को लिखते हैं। मुद्दा यह है कि आप कई छोटे लोगों में से एक "बड़ा" परमाणु प्राइमेटिव नहीं बना सकते हैं; वे लिखते नहीं हैं। आप कई चरणों का उपयोग कर सकते हैं, लेकिन अंतिम (प्रतिबद्ध) चरण एक परमाणु ऑपरेशन होना चाहिए जो सबकुछ दृश्यमान बनाता है। यदि अंत में एक से अधिक ऐसे चरण हैं, तो आपके पास स्वचालित रूप से दौड़ की स्थिति होती है। –
हे धन्यवाद। यह वही है जो मैं बाद में हूं। मुझे पता नहीं है कि मैं अपने दूसरे समाधान के साथ क्या सोच रहा था। मुझे लगता है कि यह नींद की कमी थी जिसने मुझे इतना अच्छा कोड लिखा था। – Matt