تصحيح أخطاء حالة السباق: فخ RtlRunOnceExecuteOnce

2025-03-23
تصحيح أخطاء حالة السباق: فخ RtlRunOnceExecuteOnce

واجه أحد الزملاء مشكلة تعارض صعبة خلال جلسة تصحيح أخطاء أسبوعية: فشل قسم حرج في منع خيطين من دخول نفس كتلة التعليمات البرمجية، مما أدى إلى فشل تسجيل مزدوج لـ `TraceLoggingRegister`. كشف التصحيح العميق عن السبب الجذري: أعادت دالة الإعداد `InitializeCriticalSectionOnce` لـ `RtlRunOnceExecuteOnce` قيمة `STATUS_SUCCESS` (0) بشكل غير صحيح. هذا أدى إلى اعتقاد `RtlRunOnceExecuteOnce` بأن الإعداد فشل، مما تسبب في إعادة تهيئة القسم الحرج في كل مرة يتم فيها استدعاء الدالة، وبالتالي إطلاق حالة السباق. كان الحل هو تغيير قيمة الإرجاع إلى `TRUE`، أو بشكل أنيق أكثر، استبدال `CRITICAL_SECTION` بـ `SRWLOCK`. يبرز هذا المثال كيف يمكن أن تؤدي أخطاء دقيقة في قيمة الإرجاع إلى عواقب وخيمة، ويشدد على أهمية اختيار البدائي المناسب للمزامنة.

التطوير