سؤال

أعلم أنه على أنظمة ماكوسكس / بوسيكس، هناك مبادلة ذرية ومبادلة لرمز C / C ++ عبر G ++.

ومع ذلك، لا أحتاج إلى قارن - أريد فقط المبادلة ذرية لقيمتين. هل هناك عملية مبادلة ذرية متاحة؟ [Allythign يمكنني أن أجد هو Atomic_Compare_and_Swap ... وأريد فقط أن أفعل المبادلة، دون مقارنة].

شكرا!

هل كانت مفيدة؟

المحلول

من المحتمل أن يحقق تعليمات "قفل XCHG" إنتل ما تريده ولكن لا أعتقد أن هناك وظيفة غلاف دولية لجعلها محمولة. لذلك لديك عالقتك باستخدام الجمعية المضمنة (غير محمولة) أو باستخدام قارنات ومبادلة وإجبار المقارنة مع أن تكون صحيحة (غير بعدمية). أتمنى أن يساعدك هذا :-)

نصائح أخرى

تعزز دول مجلس التعاون الخليجي هذه العملية على بعض المعالجات، تحت (المسمى بشكل مربلي) __sync_lock_test_and_set. وبعد من وثائق دول مجلس التعاون الخليجي:

 This builtin, as described by Intel, is not a traditional
 test-and-set operation, but rather an atomic exchange operation.
 It writes VALUE into `*PTR', and returns the previous contents of
 `*PTR'.

 Many targets have only minimal support for such locks, and do not
 support a full exchange operation.  In this case, a target may
 support reduced functionality here by which the _only_ valid value
 to store is the immediate constant 1.  The exact value actually
 stored in `*PTR' is implementation defined.

ومع ذلك، يتم دعم عملية المبادلة الكاملة على X86-32 و X86-64، مما يوفر بفعالية lock xchg مجمع سوف تحتاج خلاف ذلك إلى الكتابة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top