एक उपभोक्ता / उत्पादक समस्या पर, boost :: asio और thread थ्रेड के साथ मल्टीथ्रेडड कोड को बदलने में सक्षम होना है । वर्तमान में, प्रत्येक उपभोक्ता धागा एक मैंने असल में, प्रत्येक उपभोक्ता पीएस .: हाँ, यह एक प्रश्न के मुकाबले आरएफसी (टिप्पणियों के लिए अनुरोध) अधिक है :) ऐसी घटनाओं की एक सूची है, जब कोई घटना होती है, तब किया जाना चाहिए। उस सूची में से कुछ को निकालने के लिए उस सूची में कुछ और फ़ंक्शन जोड़ने के लिए फ़ंक्शन करें उसके बाद, जब घटना होती है, तो उन कार्यों की सूची पर थ्रेड्स का एक पूल होता है जिसे अब करने की आवश्यकता है। आपको विशेष रूप से घटना के लिए प्रतीक्षा करने वाले धागे की आवश्यकता नहीं है। बढ़ावा :: स्थिति_वारम पर प्रतीक्षा करता है - जब कोई उत्पादक कतार में कुछ जोड़ता है, तो यह सूचित करने के लिए
notify_one /
सूचित करें कॉल करता है सभी उपभोक्ताओं अब क्या होता है जब आप (संभावित) में 1 के + उपभोक्ता होते हैं? थ्रेड्स स्केल नहीं होंगे!
boost :: asio का उपयोग करने का निर्णय लिया है, लेकिन फिर मैं इस तथ्य में गया कि उसके पास हालत चर नहीं है और फिर
async_condition_variable पैदा हुआ था:
वर्ग async_condition_variable {private: boost :: asio :: io_service & amp; सर्विस_; Typedef बढ़ावा :: कार्य & lt; शून्य () & gt; async_handler; std :: कतार & LT; async_handler & gt; waiters_; सार्वजनिक: async_condition_variable (boost :: asio :: io_service और सेवा): service_ (सेवा) {} शून्य async_wait (async_handler हैंडलर) {waiters_.push (हैंडलर); } शून्य notify_one () {service_.post (waiters_.front ()); waiters_.pop (); } शून्य notify_all () {जबकि (! Waiters_.empty ()) {notify_one (); }}};
async_condition_variable :: wait (...) को कॉल करेंगे। फिर, एक निर्माता अंततः
async_condition_variable :: notify_one () या
async_condition_variable :: notify_all () को फोन करेगा। प्रत्येक उपभोक्ता के हैंडल को बुलाया जाएगा, और या तो इस शर्त पर कार्य करेगा या
async_condition_variable :: wait (...) पर कॉल करेगा। क्या यह संभव है या क्या मैं यहां पागल हो रहा हूं? तथ्य क्या है कि यह एक थ्रेड पूल पर चलाया जाएगा, किस प्रकार की लॉकिंग (म्यूटक्स) की जानी चाहिए?
Comments
Post a Comment