C++ के लिए कार्य कतारें: सरल से जटिल तक
\n\nकार्य कतार (Task Queue) मल्टीथ्रेडेड प्रोग्रामिंग के प्रमुख पैटर्न में से एक है। यह कार्यों के एसिंक्रोनस निष्पादन को व्यवस्थित करने की अनुमति देता है: एक या अधिक प्रदाता थ्रेड कार्य जोड़ते हैं, और कार्यकर्ता थ्रेड का एक पूल उन्हें संसाधित करता है। C++ में इसके लिए मानक साधनों के साथ-साथ विशेष लाइब्रेरी भी उपलब्ध हैं।
\n\n1. मानक कतार: std::queue लॉक के साथ
\n\nसबसे सरल विकल्प std::queue का उपयोग mutex और कंडीशनल वेरिएबल के साथ करना है। यह छोटी परियोजनाओं के लिए उपयुक्त है जहाँ सिंक्रोनाइज़ेशन का ओवरहेड महत्वपूर्ण नहीं है।
#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 और प्राथमिकता उलटाव।
2. boost::lockfree::queue — लॉक-फ्री कतार
\n\nBoost लाइब्रेरी CAS-ऑपरेशनों पर आधारित लॉक-फ्री डेटा संरचनाएँ प्रदान करती है। boost::lockfree::queue एक मल्टीथ्रेडेड लॉक-फ्री कतार है जो फिक्स्ड या डायनामिक मेमोरी पूल का उपयोग करती है।
#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नुकसान: डिबगिंग की जटिलता, सीमित आकार (फिक्स्ड संस्करण के लिए), मेमोरी रिक्लेमेशन की आवश्यकता।
3. Intel TBB (Threading Building Blocks) — tbb::concurrent_queue
\n\nIntel TBB समानांतर प्रोग्रामिंग के लिए एक औद्योगिक लाइब्रेरी है। इसका tbb::concurrent_queue (और tbb::concurrent_bounded_queue) उच्च लोड के लिए अनुकूलित है।
#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 लाइब्रेरी पर निर्भरता।
4. libdispatch (Grand Central Dispatch) C++ बाइंडिंग के माध्यम से
\n\nGCD Apple द्वारा कतार प्रबंधन प्रणाली है, जो macOS/iOS पर उपलब्ध है। C++ के लिए dispatch/queue रैपर है। Linux पर libdispatch (ओपनसोर्स) का उपयोग किया जा सकता है।
#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नुकसान: सीमित