سؤال

أنا أعاني من حادث تصادم أثناء استخدام المكتبات Boost.Spirit و BOOST.Thread في طلبي.يحدث هذا فقط إذا كنت قد استخدمت محلل الروح خلال عمر العملية من الخيط الرئيسي.

يحدث الحادث عند الخروج ويبدو أنه مرتبط بتنظيف تخزين محدد الخيط يخصصه محلل الروح.من المحتمل أن يتم تحطيمه بسبب تسلسل DLLs ، حيث يتم تخصيص ذاكرة محددة مؤشر الترابط داخل DLL تم تفريغها بالفعل.ومع ذلك، لا يتم إلغاء تحميل ملف Boost.Thread DLL حتى يتم إنهاء التطبيق نفسه.

هل هناك طريقة لي لإجبار الروح على تنظيف تخزينها المحدد ، على سبيل المثالفي ملف dll-main الخاص بي عندما أحصل على إشعار بفصل العملية؟

سيكون موضع تقدير أي حلول/تلميحات.

ملاحظة!النظام الأساسي والإعدادات الخاصة بي:

  • فيجوال ستوديو 2005
  • BOOST_ALL_DYN_LINK
  • BOOST_SPIRIT_THREADSAFE
هل كانت مفيدة؟

المحلول

حسنا لقد وجدت الحل البديل.

في كل مكان أستخدم فيه Boost::spirit::parse call، أقوم بشكل أساسي بإنشاء مؤشر ترابط عامل لتشغيله، بينما يتم حظر مؤشر ترابط الاتصال عند الانضمام إلى المكالمة مع مؤشر ترابط العامل.ليست مثالية، ولكن يبدو أنها تعمل دون أي آثار جانبية حتى الآن.

ما زلت مهتمًا بأي بدائل لأن شعوري الغريزي هو أنه لا ينبغي حقًا أن تكون هناك حاجة إلى خيط منفصل.

نصائح أخرى

Boost.Spirit هو رأس فقط، أي.إنه لا يوجد في ملف dll الخاص به، لذلك ربما لا يكون الأمر هو ترتيب تفريغ ملفات dll بل مشكلة مختلفة.

تأكد من حذف المثيل الذي يحتوي على المحلل اللغوي الخاص بك وعدم ترك مؤشرات متدلية.

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