अंतिम अद्यतन:2026-10-12
C++20 channel व्यवहारिक उपयोग¶
C++20 व्यवहारिक - channel¶
पिछले दो सेक्शन की लाइव चर्चा के बाद, जिनमें thread, jthread, stop_token, stop_source, stop_callback, cv, cv_any आदि के उपयोग और अंतर्निहित क्रियान्वयन की जानकारी दी गई, तो इस ज्ञान के आधार पर एक छोटा प्रोजेक्ट कैसे बनाएँ?
इसी से यह लेख निकला, एक channel लिखते हैं।
1. डिज़ाइन¶
1.1 इंटरफ़ेस डिज़ाइन¶
इंटरफ़ेस के स्तर पर हम आम channel की तरह चाहते हैं, कि एक बार में एक send और receive वाला channel बनाया जा सके।
उदाहरण के लिए:
यहाँ का क्रियान्वयन make_unique की तरह एक बाहरी इंटरफ़ेस देकर किया जा सकता है, रिटर्न वैल्यू C++17 की स्ट्रक्चर्ड बाइंडिंग से ली जाती है, और इस तरह दो channel मिल जाते हैं।
सबसे मुख्य दो इंटरफ़ेस: send और receive।
- Send
- Receive
इनके अलावा, destructor के समय एक shutdown इंटरफ़ेस भी दिया जा सकता है, ताकि send, recv में block होने पर जागकर रिलीज़ हो सके।
उदाहरण के लिए:
bool shutdown() {
if (!state_) {
return false;
}
light_city_lock lk(state_->mutex);
if (source_.stop_requested()) {
return false;
}
source_.request_stop();
state_->cv.notify_all();
return true;
}
1.2 आंतरिक queue डिज़ाइन¶
आंतरिक queue के लिए पिछले कुछ दिनों में प्रकाशित थ्रेड-सुरक्षित multi-producer multi-consumer queue डिज़ाइन देखा जा सकता है, यहाँ आंतरिक रूप से एक state रखा जा सकता है, साथ में queue, mutex, cv_any।
struct State {
std::queue<T> queue;
std::mutex mutex;
// C++11 condition_variable_any
std::condition_variable_any cv;
};
2. उपयोग¶
उपयोग काफ़ी आसान है, केवल make से दो channel बनाएँ, फिर send और recv करें।
मैंने यह काम jthread + stop_token से किया है, उदाहरण के लिए:
std::jthread sender_thread(
[](Channel<int> sender, std::stop_token token) {
int counter = 0;
while (!token.stop_requested()) {
sender.send(counter++);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
},
std::move(sender), token);
Receive पक्ष थ्रेड भी इसी तरह, लगभग पूरा होने पर, हम उपयोग कर सकते हैं
इस प्रकार, एक channel simulate हुआ, send पक्ष डेटा भेजता है, receive पक्ष डेटा प्राप्त करता है।
चलाने का उदाहरण:
➜ channel ./a.out
Received: 0
Received: 1
Received: 2
Received: 3
Received: 4
Received: 5
Received: 6
Received: 7
Received: 8
Received: 9
संबंधित विषय¶
- C++20 coroutines परिचय | C++那些事
- C++20 Concepts अवधारणा | C++那些事
- C++20 constexpr और comma एक्सप्रेशन | C++那些事
- C++20 byte order endian | C++那些事
- C++20 Lambda एक्सप्रेशन (भाग 1) | C++那些事
- C++20 Modules मॉड्यूल | C++那些事
- C++20 Ranges लाइब्रेरी | C++那些事
- C++20 std::span डिज़ाइन और जाल | C++那些事
- C++20 नई विशेषताओं की जानकारी | C++那些事
- C++20 [[likely]] और [[unlikely]] | C++那些事