মাল্টিথ্রেডিং হল মাল্টিটাস্কিংয়ের একটি বিশেষ রূপ এবং একটি মাল্টিটাস্কিং হল এমন একটি বৈশিষ্ট্য যা আপনার কম্পিউটারকে একসাথে দুই বা ততোধিক প্রোগ্রাম চালানোর অনুমতি দেয়। সাধারণভাবে, দুই ধরনের মাল্টিটাস্কিং আছে:প্রক্রিয়া-ভিত্তিক এবং থ্রেড-ভিত্তিক।
প্রক্রিয়া-ভিত্তিক মাল্টিটাস্কিং প্রোগ্রামগুলির একযোগে সঞ্চালন পরিচালনা করে। থ্রেড-ভিত্তিক মাল্টিটাস্কিং একই প্রোগ্রামের টুকরোগুলির একযোগে সম্পাদনের সাথে কাজ করে।
একটি মাল্টিথ্রেডেড প্রোগ্রামে দুই বা ততোধিক অংশ থাকে যা একসাথে চলতে পারে। এই ধরনের প্রোগ্রামের প্রতিটি অংশকে একটি থ্রেড বলা হয় এবং প্রতিটি থ্রেড এক্সিকিউশনের একটি পৃথক পথ সংজ্ঞায়িত করে।
C++ মাল্টিথ্রেডেড অ্যাপ্লিকেশনের জন্য কোনো অন্তর্নির্মিত সমর্থন ধারণ করে না। পরিবর্তে, এই বৈশিষ্ট্যটি প্রদান করার জন্য এটি সম্পূর্ণরূপে অপারেটিং সিস্টেমের উপর নির্ভর করে৷
এই টিউটোরিয়ালটি অনুমান করে যে আপনি লিনাক্স ওএসে কাজ করছেন এবং আমরা POSIX ব্যবহার করে মাল্টি-থ্রেডেড C++ প্রোগ্রাম লিখতে যাচ্ছি। POSIX থ্রেড, বা Pthreads API প্রদান করে যা অনেক ইউনিক্স-এর মতো POSIX সিস্টেমে যেমন FreeBSD, NetBSD, GNU/Linux, Mac OS X এবং Solaris-এ উপলব্ধ।
একটি POSIX থ্রেড -
তৈরি করতে নিম্নলিখিত রুটিন ব্যবহার করা হয়#include <pthread.h> pthread_create (thread, attr, start_routine, arg)
এখানে, pthread_create একটি নতুন থ্রেড তৈরি করে এবং এটিকে এক্সিকিউটেবল করে। এই রুটিনটি আপনার কোডের মধ্যে যে কোন জায়গা থেকে যেকোন সংখ্যক বার কল করা যেতে পারে। এখানে পরামিতিগুলির বিবরণ রয়েছে৷
৷প্যারামিটার | বর্ণনা |
---|---|
থ্রেড | সাবরুটিন দ্বারা ফিরে আসা নতুন থ্রেডের জন্য একটি অস্বচ্ছ, অনন্য শনাক্তকারী৷ |
attr | একটি অস্বচ্ছ অ্যাট্রিবিউট অবজেক্ট যা থ্রেড অ্যাট্রিবিউট সেট করতে ব্যবহার করা যেতে পারে৷ আপনি একটি থ্রেড অ্যাট্রিবিউট অবজেক্ট বা ডিফল্ট মানগুলির জন্য NULL নির্দিষ্ট করতে পারেন৷ |
start_routine | C++ রুটিন যা থ্রেড তৈরি হয়ে গেলে তা কার্যকর করবে |
arg | একটি একক যুক্তি যা start_routine-এ পাস হতে পারে৷ টাইপ void এর একটি পয়েন্টার কাস্ট হিসাবে এটি রেফারেন্স দ্বারা পাস করা আবশ্যক. কোনো যুক্তি পাস না হলে NULL ব্যবহার করা যেতে পারে। |
সর্বাধিক সংখ্যক থ্রেড যা একটি প্রক্রিয়া দ্বারা তৈরি হতে পারে তা বাস্তবায়ন নির্ভর। একবার তৈরি হয়ে গেলে, থ্রেডগুলি পিয়ার হয় এবং অন্য থ্রেড তৈরি করতে পারে। থ্রেডগুলির মধ্যে কোন অন্তর্নিহিত অনুক্রম বা নির্ভরতা নেই।
থ্রেড বন্ধ করা
নিম্নলিখিত রুটিন আছে যা আমরা একটি POSIX থ্রেড বন্ধ করতে ব্যবহার করি –
#include <pthread.h> pthread_exit (status)
এখানে pthread_exit একটি থ্রেড থেকে স্পষ্টভাবে প্রস্থান করতে ব্যবহৃত হয়। সাধারণত, pthread_exit()রুটিনটিকে একটি থ্রেড তার কাজ শেষ করার পরে বলা হয় এবং এর আর অস্তিত্বের প্রয়োজন হয় না৷
যদি main() এটি তৈরি করা থ্রেডগুলির আগে শেষ হয়ে যায় এবং pthread_exit() দিয়ে প্রস্থান করে তবে অন্যান্য থ্রেডগুলি চালানো অব্যাহত থাকবে। অন্যথায়, main() শেষ হলে সেগুলি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।
উদাহরণ
#include <iostream> #include <cstdlib> #include <pthread.h> using namespace std; #define NUM_THREADS 5 void *PrintHello(void *threadid) { long tid; tid = (long)threadid; cout << "Hello World! Thread ID, " << tid << endl; pthread_exit(NULL); } int main () { pthread_t threads[NUM_THREADS]; int rc; int i; for( i = 0; i < NUM_THREADS; i++ ) { cout << "main() : creating thread, " << i << endl; rc = pthread_create(&threads[i], NULL, PrintHello, (void *)i); if (rc) { cout << "Error:unable to create thread," << rc << endl; exit(-1); } } pthread_exit(NULL); }
আউটপুট
$gcc test.cpp -lpthread $./a.out main() : creating thread, 0 main() : creating thread, 1 main() : creating thread, 2 main() : creating thread, 3 main() : creating thread, 4 Hello World! Thread ID, 0 Hello World! Thread ID, 1 Hello World! Thread ID, 2 Hello World! Thread ID, 3 Hello World! Thread ID, 4