2010-02-11 5 views
7

वर्तमान परिदृश्य कुछ एफडीएस पर epoll_wait है और संभावित आने वाले संदेशों की कतार है, मैं आईओ घटना या नए संदेश पर निष्पादित करने के लिए epoll_wait के नीचे लूप चाहता हूं।
तरीके मुझे पता है:गैर-आईओ घटना के साथ epoll_wait को बाधित करना, कोई संकेत

  • एक time msec टाइमआउट का प्रयोग करें और पाश
  • उपयोग self-pipe trick कतार कोड जब संदेश उपलब्ध हो जाते हैं
  • इंटरप्ट एक मानक संकेत के साथ syscall से में कतार पहली बात की जांच
  • उपयोग epoll_pwait और परिष्कृत पिछले बिंदु अंक ऊपर तैनात की

कोई भी संतुष्ट मुझे enoug एच और मैं सोच रहा था कि क्या कोई अन्य तरीका है जो मुझे नहीं मिला है।
कारण हैं:

  • सिग्नल कुछ बहु कोड पर से बचने के लिए कर रहे हैं और बहुत विश्वसनीय
  • टाइमआउट एक epoll के लाभ का हिस्सा निकाल देता है, केवल घटनाओं
  • स्व पाइप चाल दिखता साथ जागने नहीं हैं इस पल के लिए सबसे अच्छा तरीका, लेकिन अभी भी बहुत अधिक बॉयलरप्लेट

विचार?

उत्तर

17

आप eventfd का उपयोग कर सकते हैं जो कम फ़ाइल डिस्क्रिप्टर और कम बॉयलरप्लेट को छोड़कर स्वयं-पाइप चाल के समान ही प्रभावी है (ग्लिबैक में उदाहरण के लिए eventfd_read/write फ़ंक्शन सुविधा है)।

+0

मैंने eventfd सफलतापूर्वक उपयोग किया है जब केवल एक थ्रेड एपॉलफ़ेड का इंतजार कर रहा है, लेकिन एकाधिक थ्रेड के बारे में * * * epollfd का इंतजार कर रहे हैं? इस तरह के मामले में भी eventfd उपयोगी है? यदि हां, तो कैसे? –

1

आपने उन घटनाओं की गणना की है जो एपोल जगा सकते हैं, इसलिए सवाल वास्तव में बन जाता है: "मैं स्वयं पाइप चाल के लिए बॉयलरप्लेट को कैसे कम करूं?"

उस प्रश्न का उत्तर वास्तव में आपके कोड, भाषा और आप जो करने की कोशिश कर रहे हैं, उस पर निर्भर करता है। मुझे लगता है कि आपके पास एक थ्रेड है जो I/O को संसाधित करता है और आप उस थ्रेड में अन्य काम करना चाहते हैं जबकि कोई I/O तैयार नहीं है। कोड में जो एपोल लूप का प्रबंधन करता है, इसमें एक आंतरिक संभाल हो सकता है जो सिस्टम के अन्य हिस्सों में "जागृत" फ़ंक्शन या "सबमिट कार्य" फ़ंक्शन के रूप में सामने आ जाता है।

ऐसे पुस्तकालय हैं जो ऐसा करते हैं, उदाहरण के लिए boost.asio C++ के लिए। हालांकि, अगर आप केवल एपोल को लक्षित कर रहे हैं, तो खुद को लिखना मुश्किल नहीं है, और जब आपके पास कक्षा/मॉड्यूल/जो भी एपोल लूप से संबंधित है, तो वास्तविक बॉयलरप्लेट कोड की मात्रा न्यूनतम होनी चाहिए।

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