करने के लिए काम न करे, ठीक है, इसलिए यह प्रश्न बिल्कुल थ्रेड प्रबंधन के बारे में नहीं है ... ठीक है, तरह। मैं इस विन्यास के विभिन्न समाधानों की तलाश में हूं। मेरे पास कुछ विचार हैं, लेकिन मैं ऐसे समाधान ढूंढ रहा हूं जो समस्या को पूरा कर सकें। और सबसे अच्छे को लागू करने के लिए पेशेवरों और विपक्ष का वजन होगा।मुझे इस धागे को सोने के लिए एक तरीका लागू करने की आवश्यकता है जब तक कि यह
यहां स्थिति है।
मेरे पास एक प्रबंधक अनुप्रयोग है जो धागे को जन्म देगा। यह धागा यूएसबी के माध्यम से सिस्टम से जुड़े बोर्डों के साथ सीरियल संचार को लगातार चलाएगा और संभाल देगा। प्रबंधक अनुप्रयोग सिस्टम और इस धागे पर चल रहे अन्य अनुप्रयोगों के बीच संचार की सुविधा प्रदान करता है। धागा वास्तव में दो बातें प्रदर्शन करने की जरूरत है: .. धारावाहिक के माध्यम से नमूना डेटा के लिए
- पोल बोर्डों एक चर टाइमर पर आमतौर पर के बारे में एक बार एक मिनट (सीरियल बस बल्कि धीमी गति से, बॉड 4800 है मैं नहीं कर सकता इसे नियंत्रित करें)
- प्रबंधक अनुप्रयोग के साथ संचार की सुविधा। (यानी अन्य अनुप्रयोग नमूना डेटा का अनुरोध करेंगे, प्रबंधक थ्रेड के अनुरोध को आगे बढ़ाएगा। थ्रेड ऑपरेशन करता है और डेटा देता है)
मेरा प्रारंभिक डिज़ाइन एक साधारण था और काम करता था। मैं थ्रेड संचार के लिए प्रबंधक के लिए एक कतार और एक mutex का उपयोग करें। तो धागे के तर्क इस प्रकार है:
- प्रारंभ
- हम प्रबंधक
- यदि हमारे टाइमर निर्भर है, डेटा
- के लिए बोर्ड अन्यथा मतदान से एक बंद आदेश नहीं मिला है, वहीं यह देखने के लिए जांचें कि क्या हमारे पास प्रबंधक द्वारा कतार में पोस्ट किया गया संदेश है या नहीं। यदि हां, तो इसे
समस्या यह है कि मैंने CPU उपयोग पर विचार नहीं किया। 99.9% जब मेरा धागा कुछ भी संसाधित नहीं कर रहा है और सिर्फ बिजली को चूस रहा है। मुझे इस थ्रेड को सोने के लिए एक तरीका लागू करने की आवश्यकता है जब तक कि यह करने के लिए काम न करे। तो कुछ विचार:
ब्लॉक करने के लिए चयन() का उपयोग करें। यह उस टाइमर के आधार पर अवरुद्ध हो सकता है जिसे मुझे उपयोग करने की आवश्यकता है, और मैं क्यूई मैसेजिंग में कतार संदेश क्रियान्वयन को बदल सकता हूं। तो इसके बजाय, धागा प्रबंधक को क्लाइंट सॉकेट खोल देगा और प्रबंधक थ्रेड पर सॉकेट पर संदेशों को पास करेगा। फिर चुनें() तब तक सो जाएगा जब तक एफडी पर गतिविधि नहीं थी या मेरा टाइमर ऊपर था।
प्रो: बिल्कुल मुझे जिस कार्यक्षमता की आवश्यकता है।
कॉन: क्या थ्रेड को संचार के लिए थोड़ा भारी प्रोसेसिंग नहीं है जहां आप पहले से ही स्मृति साझा करते हैं?
सिग्नल सिस्टम का उपयोग करें। (लिनक्स में कोई और जानकार एक कार्यान्वयन उदाहरण के साथ यहां पाइप कर सकता है ... मुझे यकीन नहीं है कि इसे कैसे करें।) लेकिन थ्रेड टाइमर की अवधि के लिए सो सकता है, और प्रक्रिया करने के लिए जागृत हो सकता है प्रबंधक से संकेत प्राप्त हुआ था।
प्रो: वर्तमान कार्यान्वयन साझा स्मृति का उपयोग कर
कोन को बनाये रखता है: सुनिश्चित नहीं हैं कि लागू करने के लिए। क्या कोई फ़ंक्शन चुनिंदा() है जो fds के बजाय सिग्नल के साथ काम करता है?
संभावित रूप से एक म्यूटेक्स। मैनेजर द्वारा एक म्यूटेक्स पोस्ट किए जाने तक मैं ब्लॉक कर सकता था।
प्रो: फिर भी साझा करने स्मृति
कोन: प्रबंधक को टाइमर प्रसंस्करण स्थानांतरित करने के लिए आवश्यकता हो सकती है और जो वास्तव में एक विकल्प के रूप में यह अन्य टाइमर और महत्वपूर्ण काम को करने के है नहीं है।
कृपया सिफारिश करें और आलोचना करने के लिए स्वतंत्र महसूस करें। मैं किसी भी कुशल विकल्प के लिए खुला हूँ। कृपया ध्यान दें कि यह एक एम्बेडेड सिस्टम पर चल रहा है, इसलिए संसाधनों का उपयोग महत्वपूर्ण है।
जब आप किसी ईवेंट की प्रतीक्षा करते हैं तो सशर्त चर का उपयोग क्यों न करें? थ्रेड को तब तक नींद में डाल दिया जाता है जब तक चर को किसी अन्य थ्रेड द्वारा संकेतित नहीं किया जाता है। – Tudor
मैं बिल्कुल कर सकता था, लेकिन मुद्दा यह है कि मैं कुछ भी संसाधित नहीं करना चाहता हूं। मैं बार-बार एक वैरिएबल के मान की जांच नहीं करना चाहता जो हर मिनट में एक बार बदलने जा रहा है। यह बहुत अधिक है। मैं धागा सोना चाहता हूं ताकि यह सीपीयू का समय छोड़ दे। – linsek
सुनिश्चित करें कि आप इससे बचें: http://stackoverflow.com/questions/3886171/why-thread-sleep-is-so-cpu-intensive –