কনকারেন্সি (Concurrency) এবং অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং (Asynchronous Programming) C++11 এবং পরবর্তী সংস্করণে প্রবর্তিত এমন দুটি ধারণা, যা প্রোগ্রামকে কার্যকরভাবে সমান্তরাল (parallel) এবং অ্যাসিঙ্ক্রোনাসভাবে কাজ করতে সহায়ক করে।
কনকারেন্সি (Concurrency)
কনকারেন্সি হলো এমন একটি প্রক্রিয়া, যেখানে একই সময়ে একাধিক কাজ চালানোর মাধ্যমে প্রোগ্রামের কার্যকারিতা বাড়ানো যায়। C++ এ কনকারেন্সির জন্য থ্রেড (thread) ব্যবহৃত হয়। কনকারেন্ট প্রোগ্রামিংয়ের মাধ্যমে একই সময়ে একাধিক থ্রেডের মাধ্যমে কাজ করা যায়।
উদাহরণ: কনকারেন্ট প্রোগ্রামিং ব্যবহার করে থ্রেড চালানো
#include <iostream>
#include <thread>
using namespace std;
void task1() {
for (int i = 0; i < 5; i++) {
cout << "Task 1 - iteration " << i << endl;
}
}
void task2() {
for (int i = 0; i < 5; i++) {
cout << "Task 2 - iteration " << i << endl;
}
}
int main() {
thread t1(task1); // থ্রেড t1 তৈরি করা যা task1 চালাবে
thread t2(task2); // থ্রেড t2 তৈরি করা যা task2 চালাবে
t1.join(); // মূল থ্রেড t1 শেষ হওয়ার জন্য অপেক্ষা করবে
t2.join(); // মূল থ্রেড t2 শেষ হওয়ার জন্য অপেক্ষা করবে
return 0;
}
বর্ণনা:
- এখানে
task1এবংtask2নামে দুটি ফাংশন তৈরি করা হয়েছে, যেগুলো আলাদা আলাদা থ্রেডে চালানো হয়েছে। t1.join()এবংt2.join()দ্বারা মূল থ্রেড অপেক্ষা করে যেt1এবংt2থ্রেড শেষ হয়ে যাবে।
অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং (Asynchronous Programming)
অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং হলো এমন একটি প্রক্রিয়া, যেখানে একটি কাজ চলতে চলতেই অন্য কাজ শুরু করা যায় এবং কাজের ফলাফল প্রাপ্তির জন্য অপেক্ষা না করেই অন্যান্য কাজ চালানো সম্ভব হয়। C++11 থেকে std::async এবং std::future ব্যবহার করে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং করা যায়।
উদাহরণ: অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং ব্যবহার করে async এবং future ব্যবহার
#include <iostream>
#include <future>
using namespace std;
// সময়সাপেক্ষ ফাংশন
int timeConsumingTask(int x) {
this_thread::sleep_for(chrono::seconds(2)); // ২ সেকেন্ড বিরতি
return x * x;
}
int main() {
cout << "Starting async task..." << endl;
// অ্যাসিঙ্ক্রোনাসলি `timeConsumingTask` চালানো হচ্ছে
future<int> result = async(timeConsumingTask, 5);
// এই সময়ে অন্য কাজ করা যেতে পারে
cout << "Doing other tasks while waiting for async result..." << endl;
// অ্যাসিঙ্ক্রোনাস কাজের ফলাফল পাওয়া
cout << "Async task result: " << result.get() << endl;
return 0;
}
বর্ণনা:
timeConsumingTaskএকটি ফাংশন, যা অ্যাসিঙ্ক্রোনাসভাবে চালানো হচ্ছে।asyncব্যবহার করেtimeConsumingTaskফাংশনটি অ্যাসিঙ্ক্রোনাসভাবে চালানো হয়েছে এবং এর রিটার্ন ভ্যালুfuture<int>টাইপেরresultএ সংরক্ষিত।result.get()ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজের ফলাফল পাওয়া যায়।
std::future এবং std::promise ব্যবহার
std::future ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজের ফলাফল পরিচালনা করা যায় এবং std::promise এর মাধ্যমে অ্যাসিঙ্ক্রোনাস কাজের রিটার্ন ভ্যালু সেট করা যায়।
উদাহরণ: std::promise এবং std::future ব্যবহার
#include <iostream>
#include <thread>
#include <future>
using namespace std;
void calculateSquare(promise<int> &&p, int x) {
this_thread::sleep_for(chrono::seconds(2)); // ২ সেকেন্ড বিরতি
p.set_value(x * x); // কাজ শেষে ভ্যালু সেট করা
}
int main() {
promise<int> p;
future<int> result = p.get_future();
thread t(calculateSquare, move(p), 5);
cout << "Calculating square asynchronously..." << endl;
cout << "Square result: " << result.get() << endl; // result.get() দিয়ে ফলাফল পাওয়া যায়
t.join();
return 0;
}
বর্ণনা:
- এখানে
promiseএবংfutureব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজের ফলাফল হ্যান্ডল করা হয়েছে। promise<int> p;এবংfuture<int> result = p.get_future();ব্যবহার করেresultএ কাজের ফলাফল পাওয়া গেছে।
কনকারেন্সি এবং অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ে ব্যবহৃত টুলস
| টুল | বিবরণ |
|---|---|
thread | C++ এ থ্রেড তৈরি এবং চালানোর জন্য ব্যবহৃত হয়, যা একাধিক কাজকে কনকারেন্টলি চালাতে পারে। |
mutex | একাধিক থ্রেডের মধ্যে ডেটা সুরক্ষিত রাখার জন্য ব্যবহৃত হয়, যা ডেটা রেস সমস্যা প্রতিরোধ করে। |
async | অ্যাসিঙ্ক্রোনাস কাজের জন্য ব্যবহৃত হয়, যেখানে কাজটি এক্সিকিউট হয়ে ফলাফল ফিরে আসা পর্যন্ত অন্য কাজ চালানো যেতে পারে। |
future | অ্যাসিঙ্ক্রোনাস কাজের ফলাফল ধরার জন্য ব্যবহৃত হয়, যা কাজ শেষ হলে ফলাফল প্রদান করে। |
promise | future এর সাথে ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজের রিটার্ন ভ্যালু সেট করে। |
condition_variable | থ্রেডের মধ্যে যোগাযোগের জন্য ব্যবহৃত হয়, যেখানে থ্রেড একটি নির্দিষ্ট শর্তের জন্য অপেক্ষা করে এবং শর্ত পূরণ হলে কাজ শুরু করে। |
কনকারেন্সি এবং অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং ব্যবহারের সুবিধা
- পারফরম্যান্স বৃদ্ধি: কনকারেন্ট এবং অ্যাসিঙ্ক্রোনাসভাবে কাজ চালানোর ফলে প্রোগ্রাম দ্রুততর হয়।
- ব্যবহারকারীর অভিজ্ঞতা উন্নত করা: অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং ব্যবহার করে ব্যাকগ্রাউন্ডে কাজ সম্পন্ন করার ফলে ব্যবহারকারীর অভিজ্ঞতা উন্নত হয়।
- রিসোর্সের কার্যকর ব্যবহার: একাধিক কাজ একই সময়ে চালিয়ে রিসোর্সের কার্যকর ব্যবহার নিশ্চিত করা যায়।
কনকারেন্সি এবং অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের চ্যালেঞ্জ
- ডেটা রেস: একাধিক থ্রেড একই ডেটা একসঙ্গে ব্যবহার করলে ডেটা রেস সমস্যা দেখা দিতে পারে।
- ডেডলক: যদি একাধিক থ্রেড একে অপরের উপর নির্ভরশীল হয়ে অপেক্ষা করে, তবে ডেডলক হতে পারে।
- ডিবাগিং জটিলতা: থ্রেড এবং অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং ব্যবহারে ডিবাগিং কঠিন হয়ে যেতে পারে।
সারসংক্ষেপ
- কনকারেন্সি হলো একাধিক কাজ একই সময়ে চালানোর প্রক্রিয়া এবং এটি থ্রেডের মাধ্যমে করা হয়।
- অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং হলো একটি কাজ চলতে চলতেই অন্য কাজ চালানোর পদ্ধতি, যা
async,future, এবংpromiseব্যবহার করে করা হয়।
কনকারেন্সি এবং অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের মাধ্যমে C++ প্রোগ্রামিংয়ে কার্যকারিতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করা যায়, যা বড় প্রোগ্রামিং প্রকল্পে অত্যন্ত কার্যকর।