C++ के लिए कार्य कतारें: लाइब्रेरियों का अवलोकन और कार्यान्वयन

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

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

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

C++ के लिए कार्य कतारें: सरल से जटिल तक

\n\n

कार्य कतार (Task Queue) मल्टीथ्रेडेड प्रोग्रामिंग के प्रमुख पैटर्न में से एक है। यह कार्यों के एसिंक्रोनस निष्पादन को व्यवस्थित करने की अनुमति देता है: एक या अधिक प्रदाता थ्रेड कार्य जोड़ते हैं, और कार्यकर्ता थ्रेड का एक पूल उन्हें संसाधित करता है। C++ में इसके लिए मानक साधनों के साथ-साथ विशेष लाइब्रेरी भी उपलब्ध हैं।

\n\n

1. मानक कतार: std::queue लॉक के साथ

\n\n

सबसे सरल विकल्प std::queue का उपयोग mutex और कंडीशनल वेरिएबल के साथ करना है। यह छोटी परियोजनाओं के लिए उपयुक्त है जहाँ सिंक्रोनाइज़ेशन का ओवरहेड महत्वपूर्ण नहीं है।

\n\n
#include <queue>\n#include <mutex>\n#include <condition_variable>\n\ntemplate<typename T>\nclass ThreadSafeQueue {\n    std::queue<T> q_;\n    mutable std::mutex mtx_;\n    std::condition_variable cv_;\npublic:\n    void push(T value) {\n        std::lock_guard<std::mutex> lock(mtx_);\n        q_.push(std::move(value));\n        cv_.notify_one();\n    }\n\n    T pop() {\n        std::unique_lock<std::mutex> lock(mtx_);\n        cv_.wait(lock, [this]{ return !q_.empty(); });\n        T val = std::move(q_.front());\n        q_.pop();\n        return val;\n    }\n};
\n\n

लाभ: सरलता, मानक लाइब्रेरी में निर्मित।
\nनुकसान: प्रत्येक ऑपरेशन पर लॉक, संभावित contention और प्राथमिकता उलटाव।

\n\n

2. boost::lockfree::queue — लॉक-फ्री कतार

\n\n

Boost लाइब्रेरी CAS-ऑपरेशनों पर आधारित लॉक-फ्री डेटा संरचनाएँ प्रदान करती है। boost::lockfree::queue एक मल्टीथ्रेडेड लॉक-फ्री कतार है जो फिक्स्ड या डायनामिक मेमोरी पूल का उपयोग करती है।

\n\n
#include <boost/lockfree/queue.hpp>\n\nboost::lockfree::queue<int> queue(128); // फिक्स्ड आकार\n\nvoid producer() {\n    for (int i = 0; i < 1000; ++i) {\n        while (!queue.push(i)) {\n            // यदि कतार भरी है, तो प्रतीक्षा करें या छोड़ दें\n        }\n    }\n}\n\nvoid consumer() {\n    int value;\n    while (queue.pop(value)) {\n        process(value);\n    }\n}
\n\n

लाभ: छोटी कतारों पर उच्च प्रदर्शन, लॉक का अभाव।
\nनुकसान: डिबगिंग की जटिलता, सीमित आकार (फिक्स्ड संस्करण के लिए), मेमोरी रिक्लेमेशन की आवश्यकता।

\n\n

3. Intel TBB (Threading Building Blocks) — tbb::concurrent_queue

\n\n

Intel TBB समानांतर प्रोग्रामिंग के लिए एक औद्योगिक लाइब्रेरी है। इसका tbb::concurrent_queue (और tbb::concurrent_bounded_queue) उच्च लोड के लिए अनुकूलित है।

\n\n
#include <tbb/concurrent_queue.h>\n\ntbb::concurrent_bounded_queue<Task> task_queue;\ntask_queue.set_capacity(1024); // आकार को सीमित करें\n\n// उत्पादक\ntask_queue.push(std::move(task));\n\n// उपभोक्ता\nTask t;\nif (task_queue.try_pop(t)) {\n    t.execute();\n}
\n\n

लाभ: उत्कृष्ट स्केलेबिलिटी, bounded/unbounded मोड का समर्थन, TBB टास्क शेड्यूलर के साथ एकीकरण।
\nनुकसान: Apache 2.0 लाइसेंस (पहले GPL), संपूर्ण TBB लाइब्रेरी पर निर्भरता।

\n\n

4. libdispatch (Grand Central Dispatch) C++ बाइंडिंग के माध्यम से

\n\n

GCD Apple द्वारा कतार प्रबंधन प्रणाली है, जो macOS/iOS पर उपलब्ध है। C++ के लिए dispatch/queue रैपर है। Linux पर libdispatch (ओपनसोर्स) का उपयोग किया जा सकता है।

\n\n
#include <dispatch/dispatch.h>\n\ndispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_CONCURRENT);\n\ndispatch_async(queue, ^{\n    // कार्य 1\n});\n\ndispatch_async(queue, ^{\n    // कार्य 2\n});\n\ndispatch_release(queue);
\n\n

लाभ: कुशल थ्रेड प्रबंधन, कोर की संख्या के अनुसार स्वचालित स्केलिंग।
\nनुकसान: सीमित

अनुशंसाएँ