कुछ पृष्ठभूमि:लिनक्स एप्लिकेशन के भीतर नकली जागने को कैसे ट्रिगर करें?
मैं एक आवेदन है कि तीसरे पक्ष के हार्डवेयर और एक बंद स्रोत ड्राइवर पर निर्भर करता है है। ड्राइवर में वर्तमान में एक बग है जो डिवाइस को यादृच्छिक अवधि के बाद प्रतिक्रिया देना बंद कर देता है। यह चालक के भीतर एक स्पष्ट डेडलॉक के कारण होता है और मेरे आवेदन की उचित कार्यप्रणाली में बाधा डालता है, जो हमेशा 24/7 पर दिखाई देने वाले वातावरण में होता है।
जो मैंने पाया है वह है कि प्रक्रिया में जीडीबी संलग्न करना, और डिवाइस को फिर से शुरू करने की प्रक्रिया में प्रक्रिया परिणामों से जीडीबी को अलग करना। यह मेरा पहला संकेत था कि ड्राइवर के भीतर थ्रेड लॉकिंग समस्या थी। कुछ प्रकार की रेस हालत है जो डेडलॉक की ओर ले जाती है। जीडीबी को जोड़ना स्पष्ट रूप से धागे के कुछ पुनर्स्थापन का कारण बन रहा था और शायद उन्हें अपने प्रतीक्षा राज्य से बाहर धकेल रहा था, जिससे उन्हें अपनी परिस्थितियों का फिर से मूल्यांकन करना पड़ा और इस प्रकार डेडलॉक तोड़ना पड़ा।
प्रश्न:
मेरा प्रश्न केवल यह है: वहाँ एक आवेदन के लिए एक साफ इंतजार कार्यक्रम उनके प्रतीक्षा राज्य में दखल देने के भीतर सभी धागे को गति प्रदान करने के लिए है? एक बात है कि निश्चित रूप से काम करता है (कम से कम मेरी कार्यान्वयन पर) किसी अन्य प्रक्रिया से एक SIGSTOP तुरंत बाद भेजने के लिए एक SIGCONT के द्वारा होता है (यानी बैश से):
kill -19 `cat /var/run/mypidfile` ; kill -18 `cat /var/run/mypidfile`
इस प्रक्रिया को और सब कुछ के भीतर एक नकली वेक-अप से चलाता है जीवन में वापस आता है।
मुझे उम्मीद है कि मेरी प्रक्रिया के भीतर सभी धागे की नकली जागरूकता को ट्रिगर करने के लिए एक बुद्धिमान तरीका है। pthread_cond_broadcast(...)
सोचें लेकिन वास्तविक स्थिति चर के उपयोग के बिना प्रतीक्षा की जा रही है।
क्या यह संभव है, या kill
जैसे किसी प्रोग्राम पर निर्भर है मेरा एकमात्र दृष्टिकोण?
आपके धागे अवरुद्ध क्या हैं? 'gdb' आपको बता सकता है कि क्या वे उपयोगकर्ता स्थान में अवरुद्ध हैं। 'ps axlm' आपको 'WCHAN' फ़ील्ड में बता सकता है। –
मेरे लिए बिल्कुल कहना मुश्किल है-जो-थ्रेड हैंडलॉक जोड़ी हैं। 'Pthread_cond_wait' में दो धागे हैं जो अपमानजनक थ्रेड के रूप में मेरा सबसे अच्छा अनुमान हैं। मैं गलत हो सकता था। यही कारण है कि मैं हर-धागे को मारने का प्रयास कर रहा हूं। मैं 'ps axlm' से अनजान था और अगली बार जब मैं इस मुद्दे को पकड़ता हूं तो अधिक डेटा इकट्ठा करने के लिए इसका उपयोग करूंगा। यह बेहद छद्म है और दुर्भाग्यवश, कोई प्रजनन कदम नहीं हैं। मैं अपने निष्कर्षों की रिपोर्ट करूंगा। –
आप प्रत्येक धागे के ढेर को पकड़ने के लिए एक स्क्रिप्ट का उपयोग कर सकते हैं। 'gdb -ex "सेट पेजिनेशन 0" -एक्स "थ्रेड सभी बीटी लागू करें" --batch -p $ (pidof EXECUTABLE_NAME) ' –