C++ में एसिंक्रोनस प्रोग्रामिंग: व्यावहारिक पूर्ण गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C++ में एसिंक्रोनस प्रोग्रामिंग: व्यावहारिक पूर्ण गाइड

\n

C++ में एसिंक्रोनस प्रोग्रामिंग एक ऐसा दृष्टिकोण है जो मुख्य निष्पादन थ्रेड को ब्लॉक किए बिना कई कार्यों को समानांतर रूप से निष्पादित करने की अनुमति देता है। सिंक्रोनस कोड के विपरीत, जहां प्रत्येक ऑपरेशन पिछले ऑपरेशन के पूरा होने की प्रतीक्षा करता है, एसिंक्रोनस कोड लंबे ऑपरेशन (I/O, नेटवर्क अनुरोध, गणना) शुरू कर सकता है और जब ये ऑपरेशन पृष्ठभूमि में पूरे होते हैं तब अन्य कार्यों को निष्पादित करना जारी रख सकता है। यह रिस्पॉन्सिव एप्लिकेशन बनाने के लिए महत्वपूर्ण है, विशेष रूप से गेमिंग उद्योग, वेब सर्वर और रियल-टाइम सिस्टम में।

\n

इस लेख में, हम व्यावहारिक रूप से C++ में एसिंक्रोनस प्रोग्रामिंग को समझेंगे: क्लासिकल मैकेनिज्म std::async और std::future से लेकर आधुनिक C++20 कोरूटीन तक। आप सीखेंगे कि इन टूल्स का सही तरीके से उपयोग कैसे करें, सामान्य गलतियों से कैसे बचें और कुशल एसिंक्रोनस सिस्टम कैसे बनाएं।

\n\n

1. एसिंक्रोनसिटी की मूल बातें: std::async और std::future

\n

C++11 मानक लाइब्रेरी एसिंक्रोनस कार्यों को शुरू करने का एक सरल तरीका प्रदान करती है — फंक्शन std::async और क्लास std::future। std::async एक अलग थ्रेड (या थ्रेड पूल) में एक फंक्शन शुरू करता है और std::future लौटाता है, जिसमें निष्पादन का परिणाम होता है।

\n\n

उदाहरण 1: एसिंक्रोनस कार्य का मूल लॉन्च

\n
#include <iostream>\n#include <future>\n#include <thread>\n#include <chrono>\n\nint longComputation(int n) {\n    std::this_thread::sleep_for(std::chrono::seconds(2));\n    return n * n;\n}\n\nint main() {\n    std::cout << "एसिंक्रोनस कार्य शुरू हो रहा है..." << std::endl;\n    std::future<int> result = std::async(std::launch::async, longComputation, 10);\n\n    // जब तक कार्य चल रहा है, अन्य काम किया जा सकता है\n    std::cout << "मुख्य थ्रेड काम करना जारी रखता है..." << std::endl;\n    std::this_thread::sleep_for(std::chrono::seconds(1));\n\n    // परिणाम प्राप्त करना (यदि कार्य अभी पूरा नहीं हुआ है तो थ्रेड को ब्लॉक करता है)\n    int value = result.get();\n    std::cout << "परिणाम: " << value << std::endl;\n    return 0;\n}
\n\n

महत्वपूर्ण बिंदु:

\n
    \n
  • std::launch::async एक अलग थ्रेड में लॉन्च की गारंटी देता है।
  • \n
  • result.get() परिणाम प्राप्त होने तक वर्तमान थ्रेड को ब्लॉक करता है।
  • \n
  • यदि get() कॉल नहीं किया जाता है, तो std::future का डिस्ट्रक्टर कार्य पूरा होने तक निष्पादन को ब्लॉक कर सकता है।
  • \n
\n\n

उदाहरण 2: एसिंक्रोनस कार्यों में अपवाद प्रबंधन

\n
#include <iostream>\n#include <future>\n#include <stdexcept>\n\nint riskyFunction(int x) {\n    if (x < 0) throw std::runtime_error("ऋणात्मक संख्या!");\n    return x * 2;\n}\n\nint main() {\n    std::future<int> future = std::async(std::launch::async, riskyFunction, -5);\n    try {\n        int result = future.get();\n        std::cout << "परिणाम: " << result << std::endl;\n    } catch (const std::exception& e) {\n        std::cout << "अपवाद: " << e.what() << std::endl;\n    }\n    return 0;\n}
\n\n

2. std::future और std::promise के साथ उन्नत कार्य

\n

std::promise एसिंक्रोनस परिणामों के मैन्युअल प्रबंधन के लिए एक उपकरण है। आप एक थ्रेड में मान या अपवाद सेट कर सकते हैं, और इसे दूसरे थ्रेड में std::future के माध्यम से प्राप्त कर सकते हैं। यह आपके स्वयं के एसिंक्रोनस पैटर्न को लागू करने के लिए उपयोगी है, उदाहरण के लिए, थ्रेड्स के बीच डेटा स्थानांतरित करने के लिए।

\n\n

उदाहरण 3: डेटा स्थानांतरण के लिए std::promise का उपयोग

\n
#include <iostream>\n#include <future>\n#include <thread>\n\nvoid producer(std::promise<std::string> prom) {\n    std::this_thread::sleep_for(std::chrono::seconds(1));\n    prom.set_value("डेटा तैयार है!");\n}\n\nint main() {\n    std::promise<std::string> promise;\n    std::future<s                

ब्लॉग

पुस्तक अनुशंसाएँ