মাল্টিথ্রেডিং হল মাল্টিটাস্কিংয়ের একটি বিশেষ রূপ এবং একটি মাল্টিটাস্কিং হল এমন একটি বৈশিষ্ট্য যা আপনার কম্পিউটারকে একসাথে দুই বা ততোধিক প্রোগ্রাম চালানোর অনুমতি দেয়। সাধারণভাবে, দুই ধরনের মাল্টিটাস্কিং আছে:প্রক্রিয়া-ভিত্তিক এবং থ্রেড-ভিত্তিক।
প্রক্রিয়া-ভিত্তিক মাল্টিটাস্কিং প্রোগ্রামগুলির একযোগে সঞ্চালন পরিচালনা করে। থ্রেড-ভিত্তিক মাল্টিটাস্কিং একই প্রোগ্রামের টুকরোগুলির একযোগে সঞ্চালনের সাথে সম্পর্কিত।
একটি মাল্টিথ্রেডেড প্রোগ্রামে দুই বা ততোধিক অংশ থাকে যা একসাথে চলতে পারে। এই জাতীয় প্রোগ্রামের প্রতিটি অংশকে একটি থ্রেড বলা হয় এবং প্রতিটি থ্রেড কার্যকর করার একটি পৃথক পথ সংজ্ঞায়িত করে৷
সি মাল্টিথ্রেডেড অ্যাপ্লিকেশনের জন্য কোনো অন্তর্নির্মিত সমর্থন ধারণ করে না। পরিবর্তে, এই বৈশিষ্ট্যটি প্রদান করার জন্য এটি সম্পূর্ণরূপে অপারেটিং সিস্টেমের উপর নির্ভর করে৷
এই টিউটোরিয়ালটি অনুমান করে যে আপনি লিনাক্স ওএসে কাজ করছেন এবং আমরা POSIX ব্যবহার করে মাল্টি-থ্রেডেড সি প্রোগ্রাম লিখতে যাচ্ছি। 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 নির্দিষ্ট করতে পারেন৷ |
শুরু_রুটিন | সি রুটিন যা থ্রেড তৈরি হয়ে গেলে তা কার্যকর করবে। |
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; printf("Hello World! Thread ID, %d\n", tid); 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) { printf("Error:unable to create thread, %d\n", rc); 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