पर परमाणु स्वैप मैं यह सत्यापित करना चाहता हूं कि मेरी समझ सही है। इस तरह की चीज मुश्किल है इसलिए मुझे यकीन है कि मुझे कुछ याद आ रहा है। मेरे पास एक प्रोग्राम है जिसमें रीयल-टाइम थ्रेड और गैर-रीयल-टाइम थ्रेड शामिल है। मैं चाहता हूं कि गैर-आरटी थ्रेड आरटी थ्रेड द्वारा उपयोग की जाने वाली मेमोरी में पॉइंटर को स्वैप करने में सक्षम हो।जीएनयू सी ++
// global
Data *rt_data;
Data *swap_data(Data *new_data)
{
#ifdef __GNUC__
// Atomic pointer swap.
Data *old_d = __sync_lock_test_and_set(&rt_data, new_data);
#else
// Non-atomic, cross your fingers.
Data *old_d = rt_data;
rt_data = new_data;
#endif
return old_d;
}
इस कार्यक्रम (प्रारंभिक सेटअप के अलावा अन्य) जहां rt_data
संशोधित किया गया है में केवल जगह है:
डॉक्स से, मैं समझता हूँ कि इस के साथ g++
में पूरा किया जा सकता है। जब rt_data
रीयल-टाइम संदर्भ में उपयोग किया जाता है, तो इसे स्थानीय सूचक में कॉपी किया जाता है। old_d
के लिए, बाद में जब यह सुनिश्चित हो जाता है कि पुरानी मेमोरी का उपयोग नहीं किया जाता है, तो इसे गैर-आरटी धागे में मुक्त किया जाएगा। क्या ये सही है? क्या मुझे कहीं भी volatile
चाहिए? क्या मुझे अन्य सिंक्रनाइज़ेशन प्राइमेटिव्स कॉल करना चाहिए?
तरह से मैं सी ++ में यह कर रहा हूं करके, हालांकि मैं में दिलचस्पी रखता हूँ कि क्या जवाब सी
समय से आगेधन्यवाद के लिए अलग है।
धन्यवाद! मैं std :: परमाणु का उपयोग करने के आपके सुझाव का पालन कर सकता हूं, यह उत्कृष्ट है। (मैं अभी तक नवीनतम सी ++ 0x सामान से परिचित नहीं हूं।) जिज्ञासा से बाहर, अगर मैं __sync_lock_test_and_set का उपयोग करता हूं, तो पढ़ने के दौरान उपयोग करने के लिए सही बाड़ क्या है? (यानी, एक स्थानीय प्रतिलिपि बनाने के लिए) – Steve