سؤال

لدي تطبيق متعدد مؤشرات الترابط في C ++ لنظام التشغيل Windows 7. يتم تجميع هذا التطبيق ك DLL لاستخدام تطبيق C # آخر.

قمت بتشغيل التعليمات البرمجية متعددة المراحل لساعات طويلة لمعالجة بيانات البث. إذا قمت بتجميع رمز C ++ هذا في .exe مستقل، وتشغيل التعليمات البرمجية، فإنه يعمل بشكل جيد.

ولكن عندما يتم تحويلها إلى DLL وعندما يعمل رمز C # معه، تعطل البرنامج مع خطأ انتهاك الوصول بعد التشغيل الطويل. أرى تحطم مشابه عندما أقوم بتحميل DLL من برنامج نصي Python وتشغيله لساعات طويلة.

عندما أشاهد السلوك باستخدام مدير المهام، أرى زيادة عدد مقبض النظام بتزايد سرعة سريعة حقا. بعد حوالي ساعتين من التعليمات البرمجية، أرى عدد المقبض عبر 300000 علامة ويحافظ على زيادة.

داخل الرمز متعدد المراقبين، يتم إنشاء المواضيع وتمزيقها باستمرار. أرى أنه بعد الخروج من الخيط، لا يتم إغلاق مقبض الخيط بشكل صريح بواسطة وظيفة Closehandle. هل يمكن أن تكون هذه مشكلة محتملة؟

كيف أؤكد أنه مشكلة مقابض. ما هي طرق مشاهدة موارد النظام هذه بطريقة أفضل؟ قبل أن أحاول أي إصلاحات، أود أن أعرف كل الحلول الممكنة حيث يستغرق تشغيل الاختبار وقتا طويلا وأكثر من 5 ساعات، لإعادة إنتاج التعطل.

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

المحلول

sysinternals عملية مستكشف العمليات يمكن عرض المقابض في عملية وتحديدلهم كمؤشر موضوع، كمبيوتر شخصي، ملف، إلخ.لديك بالتأكيد للإغلاق () كل مقبض موضوع لتنظيفها.

كجرف، إنشاء مؤشر ترابط هو عملية باهظة الثمن.إذا كنت تقوم بإنشاء الكثير من المهام الخيط، فمن الأفضل أن تنشر الوظائف وإنشاء مجموعة من عدد محدود من المواضيع (عادة ما تساوي عدد CPU في النظام) الذي يسحب من قائمة الانتظار وإجراء المهمة.

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