C++ में एसिंक्रोनस प्रोग्रामिंग का परिचय
\n\nसॉफ्टवेयर विकास की आधुनिक दुनिया में, एप्लिकेशन का प्रदर्शन और प्रतिक्रियाशीलता महत्वपूर्ण भूमिका निभाते हैं। C++ में एसिंक्रोनस प्रोग्रामिंग आपको मुख्य थ्रेड को ब्लॉक किए बिना एक साथ कई कार्यों को निष्पादित करके सिस्टम संसाधनों का कुशलतापूर्वक उपयोग करने की अनुमति देती है। यह नेटवर्क अनुरोधों, इनपुट-आउटपुट संचालन और लंबी गणनाओं के साथ काम करते समय विशेष रूप से महत्वपूर्ण है।
\n\nपारंपरिक सिंक्रोनस दृष्टिकोण के विपरीत, जहां प्रत्येक ऑपरेशन क्रमिक रूप से निष्पादित होता है, एसिंक्रोनस कोड पृष्ठभूमि में कार्यों को शुरू कर सकता है और जैसे ही वे तैयार होते हैं परिणाम प्राप्त कर सकता है। इस गाइड में, हम सरल अवधारणाओं से शुरू करके C++20 मानक की आधुनिक क्षमताओं तक, C++ में एसिंक्रोनस प्रोग्रामिंग के बुनियादी उपकरणों का पता लगाएंगे।
\n\nएसिंक्रोनसिटी की मूल बातें: std::async और std::future
\n\nC++ में एसिंक्रोनस प्रोग्रामिंग के साथ काम शुरू करने का सबसे सरल तरीका std::async का उपयोग करना है। यह फ़ंक्शन किसी कार्य को एसिंक्रोनस रूप से शुरू करता है और एक std::future ऑब्जेक्ट लौटाता है जिसमें निष्पादन का परिणाम होता है।
std::async के साथ बुनियादी उदाहरण
\n\n#include <iostream>\n#include <future>\n#include <chrono>\n\nint लंबा_ऑपरेशन() {\n std::this_thread::sleep_for(std::chrono::seconds(2));\n return 42;\n}\n\nint main() {\n std::cout << "एसिंक्रोनस कार्य शुरू कर रहे हैं..." << std::endl;\n \n // एसिंक्रोनस कार्य शुरू करना\n std::future<int> परिणाम = std::async(std::launch::async, लंबा_ऑपरेशन);\n \n std::cout << "मुख्य थ्रेड काम करना जारी रखता है..." << std::endl;\n \n // परिणाम प्राप्त करना (तैयार होने तक थ्रेड को ब्लॉक करता है)\n int मान = परिणाम.get();\n std::cout << "परिणाम: " << मान << std::endl;\n \n return 0;\n}\n\nलॉन्च पॉलिसी std::launch::async गारंटी देती है कि फ़ंक्शन एक अलग थ्रेड में निष्पादित होगा। विकल्प std::launch::deferred है, जो get() को कॉल करने तक निष्पादन को स्थगित करता है।
एकाधिक कार्यों के साथ काम करना
\n\nएसिंक्रोनस प्रोग्रामिंग विशेष रूप से कई स्वतंत्र कार्यों को समानांतर रूप से निष्पादित करने में प्रभावी है:
\n\n#include <iostream>\n#include <future>\n#include <vector>\n\nint वर्ग_गणना(int x) {\n return x * x;\n}\n\nint main() {\n std::vector<std::future<int>> कार्य;\n \n // कई एसिंक्रोनस कार्य शुरू करना\n for (int i = 1; i <= 5; ++i) {\n कार्य.push_back(std::async(std::launch::async, वर्ग_गणना, i));\n }\n \n // परिणाम एकत्र करना\n for (auto& कार्य : कार्य) {\n std::cout << "परिणाम: " << कार्य.get() << std::endl;\n }\n \n return 0;\n}\n\nउन्नत उपकरण: std::promise और std::packaged_task
\n\nC++ में एसिंक्रोनस संचालन के अधिक लचीले प्रबंधन के लिए std::promise और std::packaged_task प्रदान किए गए हैं। ये उपकरण थ्रेड्स के बीच मानों को स्थानांतरित करने और कॉल करने योग्य ऑब्जेक्ट्स को लपेटने की अनुमति देते हैं।
std::promise का उपयोग
\n\nstd::promise आपको एक मान सेट करने की अनुमति देता है जिसे बाद में संबंधित std::future ऑब्जेक्ट के माध्यम से प्राप्त किया जाएगा:
#include <iostream>\n#include <future>\n#include <thread>\n\nvoid उत्पादक_थ्रेड(std::promise<std::string> वादा) {\n try {\n std::string डेटा = "थ्रेड से महत्वपूर्ण डेटा";\n // मान सेट करना\n वादा.set_value(डेटा);\n } catch(...) {\n // अपवाद हैंडलिंग\n वादा.set_exception(std::current_exception());\n }\n}\n\nint main() {\n std::promise<std::string> वादा;\n std::future<std::string> भविष्य = वादा.get_future();\n \n std::thread थ्रेड(उ