ما الذي يجعل pthread البائد؟
-
02-07-2019 - |
سؤال
أنا أعمل مع برنامج متعدد الخيوط (باستخدام pthreads) يقوم حاليًا بإنشاء مؤشر ترابط في الخلفية (PTHREAD_DETACHED) ثم يستدعي pthread_exit(0).مشكلتي هي أن العملية يتم إدراجها بعد ذلك على أنها "معطلة" ومن الغريب أنها لا تبدو "موجودة بالفعل" في/proc (مما يهزم إستراتيجيات تصحيح الأخطاء الخاصة بي)
أرغب في تلبية المتطلبات التالية:
- يجب أن يقوم البرنامج بتشغيل الدالة A في حلقة والوظيفة B مرة واحدة
- نظرًا لمعرف PID الخاص بالبرنامج، يجب أن يكون /proc/$pid/exe و/proc/$pid/maps و/proc/$pid/fd متاحين للوصول (عندما تكون العملية معطلة، تكون جميعها روابط فارغة أو غير صالحة)
- يجب أن يكون من الممكن تعليق/مقاطعة البرنامج باستخدام CTRL+C وCTRL+Z كالمعتاد
يحرر: أتردد في تغيير واجهة البرنامج لوجود A في سلسلة الرسائل "الرئيسية" و B في سلسلة رسائل منبثقة (وهم حاليًا في الاتجاه الآخر).هل سيحل المشكلة؟
المحلول
يمكنك إما تعليق تنفيذ العملية الرئيسية في انتظار الإشارة، أو عدم فصل الخيط (باستخدام الإعداد الافتراضي PHTRAD_CRATE_JOINABLE) في انتظار إنهائه مع أ pthread_join()
.
نصائح أخرى
هل هناك سبب يمنعك من فعل الأشياء بالعكس:هل يقوم الخيط الرئيسي بتشغيل الحلقة والقيام بالمهمة لمرة واحدة في خيط الخلفية؟
ليس التصميم الأكثر أناقة ولكن ربما يمكنك حظر الخيط الرئيسي قبل الخروج باستخدام:
while(1) {
pause();
}
ثم يمكنك تثبيت معالج الإشارة لـ SIGINT وSIGTERM الذي يكسر الحلقة.أسهل طريقة لذلك هي:خروج (0) :-).