C++ এ মাল্টিথ্রেডিং ব্যবহারের মাধ্যমে একাধিক কাজ একযোগে সম্পন্ন করা যায়। থ্রেড তৈরি, ম্যানেজ করা, এবং থ্রেডের সাথে যোগাযোগ করার জন্য <thread> লাইব্রেরি এবং std::thread ক্লাস ব্যবহার করা হয়। প্রতিটি থ্রেড আলাদা একটি ফাংশন বা কোডের অংশ সম্পাদন করে।
থ্রেড তৈরি
C++ এ থ্রেড তৈরি করতে std::thread ক্লাস ব্যবহার করা হয়। থ্রেড তৈরি করার সময় ফাংশন, মেম্বার ফাংশন, বা ল্যাম্বডা ফাংশন প্রদান করা হয়, যা থ্রেডটি সম্পাদন করবে।
উদাহরণ: ফাংশন ব্যবহার করে থ্রেড তৈরি
#include <iostream>
#include <thread>
using namespace std;
void printMessage() {
cout << "Hello from thread!" << endl;
}
int main() {
thread t(printMessage); // থ্রেড t তৈরি এবং printMessage ফাংশন কল
t.join(); // থ্রেড t শেষ হওয়া পর্যন্ত অপেক্ষা
cout << "Main function ends." << endl;
return 0;
}
বর্ণনা:
- এখানে
tনামে একটি থ্রেড তৈরি করা হয়েছে, যাprintMessageফাংশন সম্পাদন করবে। t.join()দিয়ে থ্রেডটি শেষ হওয়া পর্যন্ত মেইন থ্রেড অপেক্ষা করবে।
আউটপুট:
Hello from thread!
Main function ends.
ল্যাম্বডা ফাংশন ব্যবহার করে থ্রেড তৈরি
ল্যাম্বডা ফাংশনের মাধ্যমে থ্রেড তৈরি করলে কোড আরও সংক্ষিপ্ত ও সহজ হয়।
#include <iostream>
#include <thread>
using namespace std;
int main() {
thread t([]() {
cout << "Hello from lambda thread!" << endl;
});
t.join(); // থ্রেড t শেষ হওয়া পর্যন্ত অপেক্ষা
cout << "Main function ends." << endl;
return 0;
}
বর্ণনা:
- এখানে একটি ল্যাম্বডা ফাংশন ব্যবহার করে থ্রেড
tতৈরি করা হয়েছে, যা একটি ছোট কাজ সম্পন্ন করছে। join()এর মাধ্যমে থ্রেড শেষ হওয়া পর্যন্ত মেইন থ্রেড অপেক্ষা করছে।
মেম্বার ফাংশন ব্যবহার করে থ্রেড তৈরি
কোনো ক্লাসের মেম্বার ফাংশনকেও থ্রেড হিসেবে ব্যবহার করা যায়।
#include <iostream>
#include <thread>
using namespace std;
class Worker {
public:
void printMessage() {
cout << "Hello from member function!" << endl;
}
};
int main() {
Worker worker;
thread t(&Worker::printMessage, &worker); // মেম্বার ফাংশন দিয়ে থ্রেড তৈরি
t.join(); // থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা
cout << "Main function ends." << endl;
return 0;
}
বর্ণনা:
Workerক্লাসেরprintMessageমেম্বার ফাংশন থ্রেডtএর মাধ্যমে কল করা হয়েছে।&Worker::printMessageএর মাধ্যমে মেম্বার ফাংশন থ্রেডে পাস করা হয়েছে এবং&workerএর মাধ্যমে সেই ক্লাসের অবজেক্টটি প্রদান করা হয়েছে।
থ্রেড ম্যানেজমেন্ট অপারেশন
- join():
join()মেথডের মাধ্যমে একটি থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা করা হয়। - detach():
detach()মেথড ব্যবহার করে একটি থ্রেড ব্যাকগ্রাউন্ডে চালাতে দেওয়া হয়, এবং মেইন থ্রেড অবাধে চলতে পারে। - joinable():
joinable()চেক করে যে থ্রেডটিjoin()করার জন্য প্রস্তুত কিনা।
উদাহরণ: detach এবং joinable ব্যবহার
#include <iostream>
#include <thread>
using namespace std;
void backgroundTask() {
cout << "Background task running..." << endl;
}
int main() {
thread t(backgroundTask);
if (t.joinable()) {
t.detach(); // থ্রেড ব্যাকগ্রাউন্ডে চলে যাবে
}
cout << "Main function ends." << endl;
return 0;
}
বর্ণনা:
- এখানে
tথ্রেডdetach()মেথড ব্যবহার করে ব্যাকগ্রাউন্ডে চলে গেছে। joinable()চেক করা হয়েছে যে থ্রেডটিjoinকরার যোগ্য কিনা।
আউটপুট:
Background task running...
Main function ends.
একাধিক থ্রেড পরিচালনা
একই প্রোগ্রামে একাধিক থ্রেড তৈরি করে তাদের একযোগে চালানো যায়।
#include <iostream>
#include <thread>
using namespace std;
void task1() {
for (int i = 1; i <= 5; i++) {
cout << "Task 1 - Count: " << i << endl;
}
}
void task2() {
for (int i = 1; i <= 5; i++) {
cout << "Task 2 - Count: " << i << endl;
}
}
int main() {
thread t1(task1); // প্রথম থ্রেড
thread t2(task2); // দ্বিতীয় থ্রেড
t1.join(); // প্রথম থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা
t2.join(); // দ্বিতীয় থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা
cout << "Both tasks completed." << endl;
return 0;
}
বর্ণনা:
- এখানে দুটি থ্রেড
t1এবংt2তৈরি করা হয়েছে, যাtask1এবংtask2ফাংশন চালাবে। t1.join()এবংt2.join()দিয়ে উভয় থ্রেড শেষ হওয়া পর্যন্ত মেইন থ্রেড অপেক্ষা করছে।
আউটপুট (পরিকল্পিত নয়):
Task 1 - Count: 1
Task 2 - Count: 1
Task 1 - Count: 2
Task 2 - Count: 2
...
Both tasks completed.
মাল্টিথ্রেডিং ব্যবহারে সতর্কতা
- ডেটা রেস এড়ানো: একাধিক থ্রেড একই ডেটা অ্যাক্সেস করলে ডেটা রেস হতে পারে। এটি প্রতিরোধ করতে
mutexব্যবহার করা হয়। - ডেডলক প্রতিরোধ: একাধিক
mutexব্যবহারের সময় ডেডলক সমস্যা হতে পারে। তাই সাবধানেlockএবংunlockব্যবহার করতে হবে। - থ্রেড ম্যানেজমেন্ট নিশ্চিত করা: প্রতিটি থ্রেড শেষ হওয়ার জন্য
join()বা ব্যাকগ্রাউন্ডে চালানোর জন্যdetach()করা প্রয়োজন।
সারসংক্ষেপ
- C++ এ
std::threadব্যবহার করে থ্রেড তৈরি করা যায়। join(),detach(), এবংjoinable()থ্রেড ম্যানেজমেন্টের জন্য ব্যবহৃত হয়।- মাল্টিথ্রেডিং ব্যবহারে
mutexএবং ডেডলক প্রতিরোধ ব্যবস্থা গ্রহণ করা উচিত।
থ্রেড ব্যবহারে কার্যক্ষমতা বৃদ্ধি পায়, তবে এটি ব্যবহারে সতর্ক থাকা উচিত, কারণ থ্রেড পরিচালনার ভুলে প্রোগ্রাম ক্র্যাশ করতে পারে।