मैं एक काम बाद में निष्पादित करने के लिए शेड्यूल करने के लिए एक तरह से लागू करना चाहते हैं। इंटरफ़ेस जावास्क्रिप्ट के setTimeout(function, milliseconds)
के समान होगा।सी ++ में देरी कार्यों
मेरे आवेदन में कुछ संसाधनों का धागा स्वामित्व है। दौड़ की स्थिति से बचने के लिए उन्हें हमेशा उसी धागे से एक्सेस किया जाना चाहिए। यदि अन्य धागे संसाधनों तक पहुंचना चाहते हैं तो उन्हें संसाधन थ्रेड पर कार्य ऑब्जेक्ट भेजना होगा।
तो दोनों समस्याओं मैं हल करने के लिए की जरूरत है:
- एक धागा
- देरी के लिए कोई कार्य प्रेषण मंगलाचरण
पहली समस्या जल्दी से एक ताला मुक्त कतार का उपयोग करके तय हो गई है उपभोग करने वाले पक्ष में संसाधन धागा है। (मैं टीबीबी के concurrent_bounded_queue का उपयोग करता हूं।) दूसरी समस्या हालांकि, मेरे लिए इतना स्पष्ट नहीं है। मैं दो रणनीतियों के बारे में सोच सकता हूं:
- प्रत्येक कार्य के लिए एक नया धागा प्रारंभ करें। यह धागा आवश्यक देरी सोएगा, फिर कार्य को समवर्ती कतार में प्रेषित करेगा।
- प्रारंभ केवल एक है जो एक पाश है कि अनुसूचित कार्यों iterates और उन्हें आह्वान करता है, तो उनके इंतज़ार कर समय समाप्त हो गया है चलाता है धागा।
मैंने दोनों दृष्टिकोणों के साथ प्रयोग किया है और मैं पहले पक्ष का पक्ष लेता हूं क्योंकि यह सरल और भरोसेमंद है, जबकि दूसरा सूक्ष्म बग के लिए अधिक प्रवण होता है। पहला दृष्टिकोण ओएस थ्रेड शेड्यूलर को यह प्रतिनिधि करता है।
हालांकि, पहला समाधान बहुत कम अल्पकालिक धागे बनाता है, जबकि मैं आमतौर पर धागे का पुन: उपयोग करने की सिफारिश सुनता हूं।
समय पर निष्पादन के दूसरे दृष्टिकोण में कोई गारंटी नहीं है। कभी-कभी आपको दूसरे कार्य को निष्पादित करने से पहले एक कार्य को समाप्त करने की प्रतीक्षा करनी होगी। पहला दृष्टिकोण बेहतर है। –
क्या धागे की संख्या वास्तव में बहुत अधिक होने जा रही है? कुछ हज़ारों हज़ारों की तरह? याद रखें कि सोते धागे 0 सीपीयू समय के करीब करीब उपभोग करते हैं। –
@ BartekBanachewicz मेरे आवेदन में कई साथ-साथ निर्धारित कार्य नहीं होंगे। आमतौर पर वे हर एन मिलीसेकंड में एक क्रिया करेंगे। वे मरने से पहले खुद को पुन: स्थापित करके ऐसा करते हैं। – StackedCrooked