سؤال

عندي برنامج وهو :

  • يحتوي على خيط رئيسي (1) يبدأ خيط خادم (2) وآخر (4).
  • يقوم مؤشر ترابط الخادم (2) بإجراء قبول () ثم يقوم بإنشاء مؤشر ترابط جديد (3) للتعامل مع الاتصال.

في مرحلة ما، يقوم الخيط (4) بعمل شوكة/exec لتشغيل برنامج آخر يجب أن يتصل بالمقبس الذي يستمع إليه الخيط (2).في بعض الأحيان يفشل هذا أو يستغرق وقتًا طويلاً بشكل غير معقول، ويكون تشخيصه صعبًا للغاية.إذا قمت بتتبع النظام، فيبدو أن fork/exec قد عمل، وقد حدث القبول، وتم إنشاء الخيط الجديد (4) ..ولكن لا يحدث شيء في هذا الموضوع (باستخدام strace -ff، يكون ملف معرف المنتج ذي الصلة فارغًا).

أيه أفكار؟

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

المحلول

توصلت إلى نتيجة مفادها أنه من المحتمل أن تكون هذه الظاهرة:

http://kerneltrap.org/mailarchive/linux-kernel/2008/8/15/2950234/thread

نظرًا لصعوبة تفعيل الخطأ في أنظمة التطوير لدينا، إلا أنه يتم الإبلاغ عنه عمومًا بواسطة المستخدمين الذين يعملون على أجهزة مشتركة كبيرة؛يقوم أيضًا التطبيق المتشعب بتشغيل JVM، والذي يخصص بنفسه الكثير من سلاسل الرسائل.ترتبط المشكلة أيضًا بتحميل الجهاز واستخدام الذاكرة بشكل مكثف (لدينا جهاز به ذاكرة وصول عشوائي (RAM) تبلغ سعتها 128 جيجا بايت وقد يتراوح حجم العمليات بين 10 و100 جيجا بايت).

لقد كنت أقرأ كتاب O'Reilly pthreads، الذي يشرح pthread_atfork()، ويقترح استخدام عملية "أصل بديل" متشعبة من العملية الرئيسية عند بدء التشغيل والتي يتم تشغيل العمليات الفرعية منها.ويقترح أيضًا استخدام تجمع مؤشرات الترابط الذي تم إنشاؤه مسبقًا.تبدو كلتا الفكرتين جيدتين، لذا سأقوم بتنفيذ واحدة منهما على الأقل.

نصائح أخرى

انها تبدو وكأنها حالة من الجمود.ابحث عن وظائف الحظر، مثل Accept()، يجب أن تكون المشكلة موجودة.

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

بالمناسبة - http://lists.samba.org/archive/linux/2002-February/002171.html يبدو أن سلوك pthread لـ exec ليس محددًا بشكل جيد وقد يعتمد على نظام التشغيل لديك.

هل لديك أي رمز بين fork و exec؟قد تكون هذه مشكلة.

كن حذرًا جدًا مع الخيوط والشوكة المتعددة.معظم glibc/libstdc++ آمنة لمؤشر الترابط.إذا كان هناك خيط، بخلاف خيط التفرع، يحمل قفلًا عند تنفيذ التفرع، فإن العملية المتشعبة سوف ترث كائنات المزامنة في حالتها المقفلة الحالية.لن تشهد العملية الجديدة إلغاء قفل كائنات المزامنة تلك مطلقًا.لمزيد من المعلومات، راجع man pthread_atfork.

لقد وقعت للتو في نفس المشاكل، وأخيرا وجدت ذلك fork() يكرر كافة المواضيع.تخيل الآن، ماذا يفعل برنامجك بعد fork() مع تشغيل جميع سلاسل الرسائل لمثيل مزدوج...

القواعد التالية من "دليل صغير بخصوص fork() وPthreads":

1- أنت لا تريد أن تفعل ذلك.

2- إذا كنت بحاجة إلى fork() ثم:كلما كان ذلك ممكنًا ، شوكة () جميع طفلك قبل بدء أي مؤشرات ترابط.

يحرر:حاولت، fork() لا يكرر المواضيع.

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