2009-06-26 14 views
5

मैं एकाधिक धारावाहिक बंदरगाहों से डेटा पढ़ रहा हूं। वर्तमान में मैं फ़ाइल डिस्क्रिप्टर जानकारी के आधार पर धागे की तुलना और जागने के लिए एक कस्टम सिग्नल हैंडलर (sa_handler सेट करके) का उपयोग कर रहा हूं। मैं अद्वितीय सिग्नल हैंडलर के साथ अलग-अलग धागे रखने के लिए एक रास्ता खोज रहा था, इस संबंध में मैंने पाया कि सिस्टम सिस्टम का चयन करना है।थ्रेड में सिस्टम कॉल का चयन करें?

अब मैं निम्नलिखित है प्रश्न:

  1. अगर मैं एक धागा (क्यूटी) का उपयोग कर रहा तो मैं कहाँ सीरियल पोर्ट पर नजर रखने के चयन सिस्टम कॉल रख सकता हूं?
  2. क्या चयन सिस्टम कॉल थ्रेड सुरक्षित है?
  3. क्या यह सीपीयू गहन है क्योंकि मेरे ऐप में जीयूआई अपडेट सहित कई चीजें हो रही हैं?

यदि आप इन प्रश्नों को हास्यास्पद पाते हैं, तो कृपया ध्यान न दें। मैंने सीरियल संचार के लिए इस तरह के तंत्र का कभी भी उपयोग नहीं किया है।

उत्तर

7

POSIX specification (select)select परिभाषा को देखने के लिए जगह है। मैं व्यक्तिगत रूप से poll की अनुशंसा करता हूं - इसमें एक बेहतर इंटरफ़ेस है और सिस्टम-परिभाषित सीमा के बजाय किसी भी संख्या में वर्णनकर्ताओं को संभाल सकता है।

यदि मैं सही ढंग से समझता हूं तो आप कुछ वर्णनकर्ताओं की स्थिति के आधार पर धागे जाग रहे हैं। एक बेहतर तरीका यह होगा कि प्रत्येक थ्रेड के पास अपना स्वयं का वर्णनकर्ता होगा और कॉल स्वयं का चयन करें। आप देखते हैं, सिस्टम सिस्टम को संशोधित नहीं करता है, और जब तक आप थ्रेड-स्थानीय चर का उपयोग करते हैं, यह सुरक्षित रहेगा। हालांकि, आप निश्चित रूप से यह सुनिश्चित करना चाहते हैं कि आप एक वर्णक को बंद न करें जो थ्रेड पर निर्भर करता है।

select/poll का उपयोग टाइमआउट के साथ कर्नेल पक्ष तक "प्रतीक्षा" छोड़ देता है, जिसका अर्थ है कि थ्रेड आमतौर पर सो जाता है। जबकि धागा सो रहा है, यह किसी भी CPU समय का उपयोग नहीं कर रहा है। select पर लूप के लिए थोड़ी देर के लिए दूसरी ओर एक टाइमआउट के बिना कॉल आपको उच्च CPU उपयोग देगा क्योंकि आप लगातार लूप में कताई कर रहे हैं।

उम्मीद है कि इससे मदद मिलती है।

संपादित करें: इसके अलावा, select/poll अनिश्चित परिणाम हो सकता है जब एक से अधिक थ्रेड में ही वर्णनकर्ता साथ काम करना।इस के लिए सरल कारण यह है कि पहले धागा उठ हो सकती है क्योंकि वर्णनकर्ता पढ़ने के लिए तैयार है, लेकिन दूसरी धागा वेकअप "पढ़ने के लिए उपलब्ध" अगले के लिए इंतजार करना पड़ता है।

जब तक आप एक ही वर्णनकर्ता से अधिक थ्रेड में आप एक समस्या नहीं होना चाहिए पर ing नहीं select रहे

+0

गॉड जानकारी !! एक सवाल .. थ्रेड कैसे जानता है कि सॉकेट एफडी पढ़ने/लिखने के लिए तैयार होने के लिए तैयार होने पर इसे जागने की जरूरत है। क्या कर्नेल धागे को कुछ इंटरप्ट करता है? –

+0

@ सुमितट्रेहान कर्नेल थ्रेड को जगाता है क्योंकि इसमें थ्रेड को चलने योग्य स्थिति में रखा जाता है यानी थ्रेड जल्द ही CPU समय प्राप्त होने पर चलाएगा। – Medicine

0

यह एक सिस्टम कॉल है - यह थ्रेड सुरक्षित होना चाहिए, मुझे लगता है।

मैंने पहले ऐसा नहीं किया था, लेकिन अगर यह नहीं है तो मैं आश्चर्यचकित हूं। सीपीयू गहन select() कैसे है, मेरी राय में काफी हद तक फ़ाइल हैंडल की संख्या पर निर्भर करता है जिसके लिए आप प्रतीक्षा कर रहे हैं। select() अधिकतर उपयोग किए जाने के लिए फ़ाइल हैंडल की संख्या (> 1) की प्रतीक्षा करने के लिए उपयोग किया जाता है।

यह भी उल्लेख किया जाना चाहिए कि select() का उपयोग फ़ाइल हैंडल को मतदान करने के लिए नहीं किया जाना चाहिए - प्रदर्शन कारण के लिए। सामान्य उपयोग यह है: आपने अपना काम पूरा कर लिया है और अगली चीज़ चलने तक कुछ समय समाप्त हो सकता है। अब आप अपनी प्रक्रिया को चयन के साथ निलंबित कर दें और एक और प्रक्रिया चलाएं। select() सामान्य रूप से सक्रिय प्रक्रिया को निलंबित करता है। यह धागे के साथ कैसे काम करता है, मुझे यकीन नहीं है! मुझे लगता है कि पूरी प्रक्रिया (और सभी धागे) निलंबित कर दिए गए हैं। लेकिन यह दस्तावेज हो सकता है। यह भी निर्भर करता है (लिनक्स पर) चाहे आप सिस्टम-थ्रेड या उपयोगकर्ता-थ्रेड का उपयोग करें। कर्नेल उपयोगकर्ता-थ्रेड नहीं जानता और इसलिए पूरी प्रक्रिया को निलंबित कर देगा।

+0

यह वास्तव में एक अच्छा जवाब नहीं है। अनुमान लगाने के बहुत सारे ... वैसे भी "उपयोगकर्ता-थ्रेड" क्या है ?! –

संबंधित मुद्दे