وهناك القليل من الجمعية
بعد قراءة هذا المقال عن مخازن قفل حرة ورؤية استخدام CAS (قارن والمبادلة)، شعرت وكأني نشر رمز الجمعية أن تفعل نفس الشيء. استخدام أكثر من حالة كان هناك طريقة لكتابة الأصلي والذي يطلق عليه من جافا (مرة أخرى في 1.5، عندما المتزامنة هياكل البيانات في جاوة كانت أكثر أو أقل غير موجود). دون مزيد من اللغط، وأنا على إطلاق العنان للرمز لك
. الأول هو لاستراتيجية المساعدة القطرية والثاني هو لGCD الحوسبة باستخدام خوارزمية إقليدس (ويمكن الاطلاع على هذا واحد في كثير من الأماكن والبرامج التعليمية وكذلك).
ترجمة وتشغيل تعليمات gcc file_name.c ; ./a.out
قارن ومقايضة
وتشمل #وتشمل # / / تبادل - newvalue، comperand قديمة / القيمة المتوقعة / * * وظيفة في الواقع لا شيء التالية - إذا كانت القيمة في دست * تساوي oldvalue ثم الاستعاضة عنها newvalue آخر ترك الأمر دون تغيير: هل كل هذه بالذرة * * وهناك خياران لقيمة الإرجاع * القيمة الأولية 1.is من دست * وترك عبء fxn يدعو لمقارنتها مع oldval * 2. يفعل ذلك أكثر من هنا والعودة 0 أو 1، وهذا ينبغي أن تكون أكثر كفاءة ** / / * تغيير في وقت لاحق إلى الماكرو * / مادبا CAS (INT * دست، وكثافة العمليات oldvalue، وكثافة العمليات newvalue) { printf ("(٪ د، د٪، د٪)"، * دست، oldvalue، newvalue)؛ / * كثافة العمليات CAS (INT دست، وكثافة العمليات oldvalue، وكثافة العمليات newvalue) {* / / * كثافة العمليات CAS (INT دست، وكثافة العمليات newvalue، وكثافة العمليات oldvalue) {* / مادبا نتيجة = 1 ؛/ * 1 يدل على أن استراتيجية المساعدة القطرية نجحت و 0 يدل على أن فشلت * / / * راجع للشغل في حاجة إلى تعيين مكعب للعلم clobbering! * / __asm__ __ volatile__ ( "movl 2٪،٪ EAX٪ \ ن \ T" "movl٪ 3،٪٪ EBX \ ن \ T" "movl 0٪،٪٪ ECX \ ن \ T" "قفل \ ن \ T" "CMPXCHG٪ EBX٪، (٪ ECX٪) \ ن \ ر" يجب أن / * قفل تكون على نفس السطر * / "JZ حررت \ ن \ T" "movl $ 0، 1٪ \ ن \ T" "حررت: \ ن \ T" : "= م" (دست)، "= ز" (النتيجة) : "ز" (oldvalue)، "ز" (newvalue)، "م" (دست) : "EAX٪"، "EBX٪"، "ECX"، "سي سي" )؛ printf ("(٪ د، د٪، د٪)"، * دست، oldvalue، newvalue)؛ عودة نتيجة؛ } / * TODO * الكتابة آخر fxn ASM الذي يضع فوق fxn في حلقة وبينما تحاول أن تبقي ما لم ينجح * / الباحث الرئيسي () { مادبا 1 = 5، ب = 6؛ مادبا * ج = (كثافة العمليات *) malloc (sizeof (الباحث))؛ * ج = 6؛ / * كثافة ج = 6؛ * / printf ("٪ د \ ن"، CAS (ج، ب، ب))؛ printf ("٪ د \ ن"، CAS (ج، ب، أ))؛ printf ("٪ د \ ن"، CAS (ج، أ، أ))؛ printf ("٪ د \ ن"، CAS (ج، ب، ب))؛ * ج = 6؛ / * ج = 5؛ * / printf ("القيمة المتغيرة لل* ج ب٪ د \ ن"، * ج)؛ printf ("٪ د \ ن"، CAS (ج، ب، ب))؛ printf ("٪ د \ ن"، CAS (ج، ب، أ))؛ printf ("٪ د \ ن"، CAS (ج، أ، أ))؛ printf ("٪ د \ ن"، CAS (ج، أ، ب))؛ printf ("٪ د \ ن"، CAS (ج، ب، أ))؛ عودة 0؛ }
تلاحظ التنسيق - يبدو وكأنه تمييز بناء الجملة WP تضيف في النهاية، تجاهل ذلك.
GCD
وتشمل #مادبا GCD (كثافة العمليات أ، كثافة العمليات ب) { مادبا النتيجة؛ / * حساب المقسوم المشترك الأكبر باستخدام خوارزمية إقليدس * / __asm__ volatile__ __ ("movl٪ 1،٪ EAX٪؛" "movl 2٪،٪ EBX٪؛" "تابع: cmpl $ 0٪٪، EBX"؛ "التهاب الدماغ الياباني الذي قام به؛" "٪٪ xorl EDX، EDX٪٪؛" "٪٪ idivl EBX"؛ "٪٪ movl EBX، EAX٪٪؛" "٪٪ movl EDX، EBX٪٪؛" "تابع أحزاب اللقاء المشترك"؛ "حررت: movl٪ EAX٪، 0٪؛": "= ز" (النتيجة): "ز" (أ)، "ز" (ب) )؛ عودة نتيجة؛ } الباحث الرئيسي () { مادبا الأولى والثانية؛ printf ("أدخل عددين:")؛ scanf ("٪ D٪ D"، و 1، و 2)؛ printf ("GCD٪ من D & D٪ هو٪ د \ ن"، الأولى والثانية، GCD (الأولى والثانية))؛ عودة 0؛ }



































