मैंने boost::asio
का उपयोग करके एक थ्रेड पूल लागू किया है, और कुछ संख्या boost::thread
ऑब्जेक्ट्स boost::asio::io_service::run()
पर कॉल कर रही हैं। हालांकि, मुझे जो आवश्यकता है वह "स्वास्थ्य" के लिए सभी धागे की निगरानी करने का एक तरीका है। मेरा इरादा एक साधारण सेंटीनेल ऑब्जेक्ट बनाना है जिसे थ्रेड पूल के माध्यम से पारित किया जा सकता है - अगर यह इसे बनाता है, तो हम मान सकते हैं कि थ्रेड अभी भी काम कर रहा है।बूस्ट :: एएसओ, थ्रेड पूल और थ्रेड मॉनिटरिंग
हालांकि, मेरे कार्यान्वयन के बाद, मुझे यकीन नहीं है कि कैसे (अगर) मैं पूल में सभी धागे को विश्वसनीय रूप से देख सकता हूं। मैंने बस थ्रेड फ़ंक्शन को boost::asio::io_service::run()
पर सौंप दिया है, इसलिए io_service
इंस्टेंस में एक सेंटीनेल ऑब्जेक्ट पोस्ट करना यह गारंटी नहीं देगा कि कौन सा थ्रेड वास्तव में उस सेंटीनेल को प्राप्त करेगा और काम करेगा।
एक विकल्प समय-समय पर सेंटीनेल डालने के लिए हो सकता है, और उम्मीद है कि यह प्रत्येक थ्रेड द्वारा कम से कम एक बार उचित समय में उठाया जाता है, लेकिन यह स्पष्ट रूप से आदर्श नहीं है।
निम्नलिखित उदाहरण लें। जिस तरह से हैंडलर को कोड किया गया है, इस उदाहरण में हम देख सकते हैं कि प्रत्येक थ्रेड एक ही काम करेगा, लेकिन असल में मुझे हैंडलर कार्यान्वयन पर नियंत्रण नहीं होगा, कुछ लंबे समय तक चल सकते हैं जबकि अन्य लगभग तत्काल।
#include <iostream>
#include <boost/asio.hpp>
#include <vector>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
void handler()
{
std::cout << boost::this_thread::get_id() << "\n";
boost::this_thread::sleep(boost::posix_time::milliseconds(100));
}
int main(int argc, char **argv)
{
boost::asio::io_service svc(3);
std::unique_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(svc));
boost::thread one(boost::bind(&boost::asio::io_service::run, &svc));
boost::thread two(boost::bind(&boost::asio::io_service::run, &svc));
boost::thread three(boost::bind(&boost::asio::io_service::run, &svc));
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
work.reset();
three.join();
two.join();
one.join();
return 0;
}
क्या आप अपने उत्तर @Chad में कोड जोड़ सकते हैं? –
हो गया। इस पर किसी भी प्रतिक्रिया के लिए खुश है। – Chad