C/C++ shared memory, atomic operations, Linux -


मैं बहु- प्रोसेसर सर्वर पर साझा स्मृति का उपयोग करके अंतर-प्रक्रिया संचार कर रहा हूं मैंने कोड को निम्न में सरल कर दिया है:

  struct mystruct {uint64_t x; }; वाष्पशील MyStruct * my_struct; // अन्य जगह अपना माइक्रोन शून्य (यूआईटी 64_टी वाई) {जबकि (सच) {uint64_t current_x = my_struct-> x; यदि (__sync_bool_compare_and_swap (& amp; my_struct- & gt; x, current_x, y)) {ड्ववर्कर् (वर्तमान_एक्स, वाई); // current_x और y रिटर्न के आधार पर यहां काम करते हैं; }}}   

मेरा प्रश्न: क्या यह कोड सही है?

विशेष रूप से, मुझे

__ sync_synchronize जोड़ना होगा ( )

uint64_t current_x = my_struct-> x से पहले या यह निम्नलिखित लाइन पर परमाणु सीएएस के बाद से अनावश्यक होगा प्रभावी ढंग से है कि वैसे भी करता है? जैसा कि आप देख सकते हैं, प्रभावी रूप से मुझे क्या चाहिए __sync_lock_test_and_set कार्यक्षमता हालांकि, ऐसा लगता है कि ऐसा कार्य हमेशा अपेक्षित काम नहीं कर सकता।

  जबकि (सच ) {Uint64_t current_x = my_struct-> x; / * सीवेएट: my_struct कुछ अलग बात कर सकता है * / if (__sync_bool_compare_and_swap (& my_struct- & gt; x, current_x, y))   

अगर आपको इसकी परवाह नहीं है < कोड> my_struct एक अलग संरचना को इंगित कर सकता है, लेकिन मूल संरचना के समान एक ही x मान है, तो कोड ठीक लगता है। ऐसा लगता है कि आपका कोड इसका मतलब है कि यह ठीक है क्योंकि आपका डूवर्क्स केवल current_x और y के बारे में परवाह करता है। < / html>

Comments