क्या यह एक सामान्य परमाणु स्वैप फ़ंक्शन के लिए सही कार्यान्वयन है? मैं जीसीसी पर एक सी ++ 03-संगत समाधान की तलाश में हूं।जीसीसी परमाणु निर्मित का उपयोग कर परमाणु स्वैप समारोह
template<typename T>
void atomic_swap(T & a, T & b) {
static_assert(sizeof(T) <= sizeof(void*), "Maximum size type exceeded.");
T * ptr = &a;
b =__sync_lock_test_and_set(ptr, b);
__sync_lock_release(&ptr);
}
यदि नहीं, तो इसे ठीक करने के लिए मुझे क्या करना चाहिए?
भी: __sync_lock_release
हमेशा आवश्यक है? अन्य कोडबेस के माध्यम से खोज करते समय मैंने पाया कि इसे अक्सर नहीं कहा जाता है। रिहाई के बिना फोन मेरे कोड इस तरह दिखता है:
template<typename T>
void atomic_swap(T & a, T & b) {
static_assert(sizeof(T) <= sizeof(void*), "Maximum size type exceeded.");
b = __sync_lock_test_and_set(&a, b);
}
पुनश्च: Atomic swap in GNU C++ एक ऐसी ही सवाल है, लेकिन यह मेरे सवाल का जवाब नहीं है क्योंकि प्रदान की जवाब सी ++ 11 के std::atomic
और यह है हस्ताक्षर Data *swap_data(Data *new_data)
जो नहीं करता है 'की आवश्यकता है टी swap
फ़ंक्शन के लिए बिल्कुल समझ में आता है। (यह वास्तव में प्रदान किए गए तर्क को वैश्विक चर के साथ स्वैप करता है जिसे फ़ंक्शन से पहले परिभाषित किया गया था।)
ऐसा लगता है कि 'ए' तक पहुंच केवल परमाणु माना जाता है? –
एक पहिया का फिर से आविष्कार क्यों किया? Http://concurrencykit.org/ –
@BenVoigt पर यह पोस्ट स्पष्ट उत्तर नहीं देता है। और यह एक वैश्विक चर के साथ तर्क swaps। – StackedCrooked