यह कुछ हद तक this question से संबंधित है, लेकिन मुझे लगता है कि मुझे थोड़ा और जानने की आवश्यकता है। मैं अपने सिर को कुछ दिनों के लिए कैसे करना है (अन्य हिस्सों पर काम करते समय) के बारे में अपने सिर को पाने की कोशिश कर रहा हूं, लेकिन मेरे लिए बुलेट काटने और बहु-थ्रेड प्राप्त करने का समय आ गया है। साथ ही, मैं जुड़े प्रश्न से थोड़ा अधिक जानकारी के बाद हूं।boost :: asio, threads और सिंक्रनाइज़ेशन
सबसे पहले, बहु-थ्रेडिंग के बारे में। जैसा कि मैं अपने कोड का परीक्षण कर रहा हूं, मैंने किसी भी बहु-थ्रेडिंग से परेशान नहीं किया है। यह सिर्फ एक कंसोल एप्लिकेशन है जो एक परीक्षण सर्वर से कनेक्शन शुरू करता है और बाकी सब कुछ तब संभाला जाता है।
while(true)
{
Root::instance().performIO(); // calls io_service::runOne();
}
जब मैं अपने मुख्य आवेदन लिखते हैं, मैं इस समाधान अनुमान लगा रहा हूँ स्वीकार्य नहीं होगा (के रूप में यह संदेश पाश में कहा जा करने के लिए होता है जो, जबकि संभव हो, के लिए होता है: मुख्य पाश यह है संदेश संदेश कतार ब्लॉक संदेश के लिए इंतजार कर रहा है। आप इसे बदल सकते हैं ताकि संदेश-लूप ब्लॉक न हो, लेकिन फिर यह छत के माध्यम से सीपीयू उपयोग को फटकारने वाला नहीं है?)
इसका समाधान ऐसा लगता है कि इसमें एक और धागा फेंकना है। अच्छा ठीक है। लेकिन फिर मैंने पढ़ा है कि io_service::run()
ऐसा करने के लिए कोई काम नहीं करता है। वो क्या है? क्या ऐसा कोई डेटा नहीं है, या कोई कनेक्शन नहीं है? यदि कम से कम एक कनेक्शन मौजूद है तो क्या यह जीवित रहेगा? यदि ऐसा है, तो यह एक समस्या का इतना अधिक नहीं है क्योंकि मुझे पहले कनेक्शन होने पर केवल एक नया धागा शुरू करना होगा और अगर मैं कुछ भी नहीं चल रहा हूं तो यह सब बंद हो जाता है। मुझे लगता है कि मैं 'काम करने के लिए कोई काम नहीं' की परिभाषा से उलझन में हूं।
तब मुझे अपने मुख्य जीयूआई थ्रेड के साथ अपने बूस्ट थ्रेड को सिंक्रनाइज़ करने के बारे में चिंता करने की ज़रूरत है। तो, मुझे लगता है कि मेरे प्रश्न हैं:
- थ्रेड के संबंध में क्लाइंट एप्लिकेशन में बूस्ट :: एएसओ का उपयोग करने और उन्हें जीवित रखने का सबसे अच्छा तरीका क्या है?
- मुख्य धागे से आईओ थ्रेड तक सॉकेट लिखते समय,
boost::asio::post
का उपयोग करके सिंक्रनाइज़ेशन प्राप्त किया जाता है, ताकि कॉल बाद में io_service में हो? - जब डेटा प्राप्त होता है, तो लोग यूआई थ्रेड पर डेटा कैसे प्राप्त करते हैं? अतीत में जब मैंने पूरा बंदरगाहों का उपयोग किया, तो मैंने एक विशेष कार्यक्रम बनाया जो डेटा को वापस भेजकर मुख्य UI थ्रेड पर :: SendMessage का उपयोग कर पोस्ट कर सकता था। यह सुरुचिपूर्ण नहीं था, लेकिन यह काम किया।
मैं आज और कुछ पढ़ रहा हूं, लेकिन यह पहले से ही ऐसा करने वाले किसी व्यक्ति से सिर प्राप्त करना बहुत अच्छा होगा। बूस्ट :: एएसओ दस्तावेज बहुत अच्छा नहीं है, और अब तक मेरा अधिकांश काम दस्तावेज, कुछ परीक्षण/त्रुटि, वेब पर कुछ उदाहरण कोड पर आधारित है।
+1 io_service :: काम यह है कि मैं इस समस्या को स्वयं कैसे हल करता हूं। आपकी प्रतिक्रिया के लिए –
धन्यवाद। जब आप कहते हैं कि कई संभावनाएं हैं, तो आपने पहले क्या उपयोग किया है? –
@ म्यू-रस, मैं ऐसी स्थिति में नहीं रहा हूं जहां एक विशिष्ट जीयूआई थ्रेड था जिसे डेटा को संभालने के लिए आवश्यक था। मैंने अभी कॉलबैक तंत्र का उपयोग किया है और डेटा को आईओ_एस सर्विस थ्रेड से संभाला है जैसा कि आया था।संदेश कतार के कुछ रूप जो गुई धागे पढ़ते हैं, का उपयोग नए डेटा के आगमन को इंगित करने के लिए किया जा सकता है। या आप बस एक सशर्त चर का उपयोग कर सकते हैं। रेली आपके आवेदन, डिजाइन और आवश्यकताओं पर निर्भर करता है। सलाह के लिए –