أرى مشكلة عرضية على netcore 2.2 حيث يبدو أن Gen2 GC المتزامن لا يعمل على مؤشر ترابط GC في الخلفية ، وبدلاً من ذلك يعمل على الخيط الذي أدى إلى تشغيل المجموعة.
تمت ملاحظة ذلك في تطوير Windows 10 الخاص بي الذي يقوم بتشغيل تطبيق في تكوين الإصدار على وقت تشغيل .NET Core 2.2 64 بت مع ملف تعريف GC الافتراضي (محطة العمل ، وتمكين GC المتزامن ، ووضع زمن الانتقال التفاعلي) ، وتمكنت من الحصول على عينة perfview من الحدوث:
بالنظر إلى مصدر GC ، أعتقد أنه قد تكون هناك مشكلة تم تقديمها في هذا الالتزام . قبل التغيير ، سيتم تعيين bgc_thread
في وقت إنشاء سلسلة الرسائل ، وسيتم ضمان تعيينها بحلول الوقت الذي يتم فيه التحقق في void gc_heap::garbage_collect (int n)
. بعد التغيير ، تم تعيين bgc_thread
الآن ضمن مؤشر ترابط جديد في بداية تنفيذه ، والذي يبدو أنه سيقدم حالة سباق حيث قد لا يتم تعيين هذا الحقل في الوقت المناسب لمواصلة GC المتزامنة.
آه ، بحث جيد!
PeterSolMS ، VSadov هل من فضلك
أردت فقط الإشارة إلى أن GC الفعلي الذي تم إجراؤه هنا لم يعد BGC - إنه يتعامل معه فقط لأننا فشلنا في إنشاء مؤشر ترابط BGC ، لذلك نحن ببساطة نقوم بعمل حظر كامل GC ؛ الحدث مضلل (لا يزال يشير إلى الخلفية) لذا يجب إصلاح ذلك أيضًا في حالة فشلنا في تنفيذ BGC بالفعل (فشل في إنشاء مؤشر ترابط BGC أو لأي سبب آخر).
لسباق إعداد bgc_thread ، لا نحتاج في الواقع إلى تعيينه في bgc_thread_stub
، في CreateSuspendableThread
بعد هذا السطر
args.Thread = SetupUnstartedThread(FALSE);
كائن Thread متاح بالفعل - كل المنطق اللاحق في هذه الوظيفة لا يغير الخيط الذي تم إنشاؤه على أي حال.
التعليق الأكثر فائدة
أردت فقط الإشارة إلى أن GC الفعلي الذي تم إجراؤه هنا لم يعد BGC - إنه يتعامل معه فقط لأننا فشلنا في إنشاء مؤشر ترابط BGC ، لذلك نحن ببساطة نقوم بعمل حظر كامل GC ؛ الحدث مضلل (لا يزال يشير إلى الخلفية) لذا يجب إصلاح ذلك أيضًا في حالة فشلنا في تنفيذ BGC بالفعل (فشل في إنشاء مؤشر ترابط BGC أو لأي سبب آخر).