سؤال

أريد أن أعرف ما إذا كنت أحاول ضبط البتات داخل char/integer من سلاسل خيوط متعددة ، هل سأفقد أي تعديل؟ سيكون لدي جميع الأصفار في البداية وسيقوم الخيوط بتعيينها فقط على 1. بنية النظام هي X64.

شكرا ، جوكول.

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

المحلول

على عمليات X64 (و x86) على INTS هي ذرية. هذا يعني أن القراءة والكتابة ذرية بشكل مستقل ، وليس في تركيبة. (على سبيل المثال ، إذا كان لديك خيطان يكتبان int في نفس الوقت ، فلن ترى نصف واحد ونصف الآخر - سترى دائمًا ENT كامل أو آخر.)

ومع ذلك ، فإن القراءة والكتابة هي عمليتان منفصلتان. يمكنك إجراء بعض العمليات المتشابكة (مما تسبب في القراءة والكتابة لتكون عملية ذرية واحدة) ، لكنني لا أعتقد أن منطق Bitwise يقع في مجموعة العمليات التي يمكن تنفيذها بهذه الطريقة.

أعتقد أنه سيتعين عليك قفل بعض Mutex/Monitor وأداء القراءة/الكتابة إذا كنت تريد أن تكون هذه العملية ذرية.

نصائح أخرى

يجب عليك استخدام إما mutex أو آلية المزامنة مماثلة ، أو عملية ذرية. بالنسبة إلى السابق ، هناك مكتبات Posix و Windows متاحة بسهولة ومعتادة للغاية. بالنسبة لهذا الأخير ، سيوفر معظم المترجمين بعض الوظائف (على سبيل المثال http://gcc.gnu.org/wiki/atomic) ، وضع التجميع المضمّن أو طريقة أخرى مريحة لاستخدامها ، ويمكنك دائمًا العودة إلى الارتباط بكائن تم تجميعه من لغة التجميع.

بالتأكيد لا يمكنك تجنب هذا التزامن الصريح. حتى إذا كان يقول XOR بطريقة أو بأخرى بشكل مباشر وذري على القيمة في ذاكرة التخزين المؤقت للذاكرة الأعمق في وحدة المعالجة المركزية (وهو ما لا) ، فأنت بحاجة إلى ضمان مزامنة القيمة مع ذاكرة التخزين المؤقت الأخرى ل CPU Core. تعتبر تعليمات وحدة المعالجة المركزية فقط التي تزامن بشكل صريح مفيدة لك - من الأسهل استخدامها من خلال أحد خيارات المكتبة المذكورة أعلاه.

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