সি প্রোগ্রামিং ভাষায় থ্রেড ব্যবহার এবং মিউটেক্স (mutex) হ্যান্ডলিং সাধারণত POSIX Threads (pthreads) লাইব্রেরি ব্যবহার করে করা হয়। থ্রেড তৈরি, সিঙ্ক্রোনাইজেশন এবং মিউটেক্স ব্যবহৃত হয় বহুসংখ্যক থ্রেডের মধ্যে সঠিকভাবে কাজ করতে এবং মেমোরি রেস কন্ডিশন (race condition) এড়াতে। নিচে থ্রেড তৈরি, সিঙ্ক্রোনাইজেশন এবং মিউটেক্স হ্যান্ডলিংয়ের বিস্তারিত আলোচনা করা হলো।
থ্রেড হলো একটি প্রক্রিয়ার মধ্যে কাজ করার স্বতন্ত্র একক। থ্রেড তৈরি করতে pthread_create()
ফাংশনটি ব্যবহার করা হয়।
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);
thread
: নতুন থ্রেডের জন্য একটি পয়েন্টার।attr
: থ্রেডের অ্যাট্রিবিউট সেটিংস (সাধারণত NULL
পাঠানো হয়)।start_routine
: থ্রেডের জন্য শুরু হওয়া ফাংশন।arg
: শুরু হওয়া ফাংশনে পাস করা আর্গুমেন্ট (যদি প্রয়োজন হয়)।#include <stdio.h>
#include <pthread.h>
void *hello_world(void *arg) {
printf("Hello from thread!\n");
return NULL;
}
int main() {
pthread_t thread; // থ্রেড ডিক্লেয়ারেশন
// থ্রেড তৈরি
if (pthread_create(&thread, NULL, hello_world, NULL) != 0) {
perror("Thread creation failed");
return 1;
}
// থ্রেডের শেষ হওয়া পর্যন্ত অপেক্ষা করা
pthread_join(thread, NULL);
printf("Thread finished executing.\n");
return 0;
}
এখানে pthread_create()
ফাংশনটি একটি নতুন থ্রেড তৈরি করেছে, যা hello_world()
ফাংশনটি চালাবে। pthread_join()
ফাংশনটি থ্রেডটি শেষ হওয়া পর্যন্ত অপেক্ষা করে।
থ্রেড সিঙ্ক্রোনাইজেশন নিশ্চিত করে যে একাধিক থ্রেডের মধ্যে কোনও ডেটা কনফ্লিক্ট বা রেস কন্ডিশন (যখন একাধিক থ্রেড একই ডেটা এক্সেস করে) না ঘটে। সিঙ্ক্রোনাইজেশন বিভিন্ন মেকানিজমের মাধ্যমে করা হয়, যেমন মিউটেক্স (mutexes), কন্ডিশন ভেরিয়েবল, সেমাফোর ইত্যাদি।
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mutex; // মিউটেক্স ডিক্লেয়ারেশন
void *increment(void *arg) {
pthread_mutex_lock(&mutex); // মিউটেক্স লক করা
// critical section
printf("Thread is executing\n");
pthread_mutex_unlock(&mutex); // মিউটেক্স আনলক করা
return NULL;
}
int main() {
pthread_t threads[5];
// মিউটেক্স ইনিশিয়ালাইজ করা
pthread_mutex_init(&mutex, NULL);
// থ্রেড তৈরি করা
for (int i = 0; i < 5; i++) {
pthread_create(&threads[i], NULL, increment, NULL);
}
// থ্রেডের শেষে যাওয়া
for (int i = 0; i < 5; i++) {
pthread_join(threads[i], NULL);
}
// মিউটেক্স ডেস্ট্রয় করা
pthread_mutex_destroy(&mutex);
printf("All threads finished.\n");
return 0;
}
এখানে, pthread_mutex_lock()
এবং pthread_mutex_unlock()
ফাংশনগুলো ব্যবহার করে মিউটেক্স সিঙ্ক্রোনাইজেশন পরিচালনা করা হয়েছে।
মিউটেক্স (mutual exclusion) একটি সিঙ্ক্রোনাইজেশন প্রক্রিয়া যা একাধিক থ্রেডের মধ্যে একে অপরের কাছে একসাথে ডেটা অ্যাক্সেসে বাধা দেয়। এটি একটি লকিং মেকানিজম, যা নিশ্চিত করে যে এক সময়ে শুধুমাত্র একটি থ্রেড মেমোরি বা রিসোর্স অ্যাক্সেস করতে পারে।
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
pthread_mutex_init()
: মিউটেক্স ইনিশিয়ালাইজ করে।pthread_mutex_lock()
: মিউটেক্সে লক করে, যদি অন্য কোনো থ্রেড মিউটেক্সে লক করে থাকে, তাহলে এটি অপেক্ষা করবে।pthread_mutex_unlock()
: মিউটেক্স আনলক করে, অন্য থ্রেডের জন্য লক উপলব্ধ করে।pthread_mutex_destroy()
: মিউটেক্স ধ্বংস করে।#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mutex;
int counter = 0;
void *increment(void *arg) {
pthread_mutex_lock(&mutex); // মিউটেক্স লক করা
counter++;
printf("Counter value: %d\n", counter);
pthread_mutex_unlock(&mutex); // মিউটেক্স আনলক করা
return NULL;
}
int main() {
pthread_t threads[5];
pthread_mutex_init(&mutex, NULL); // মিউটেক্স ইনিশিয়ালাইজ
// থ্রেড তৈরি
for (int i = 0; i < 5; i++) {
pthread_create(&threads[i], NULL, increment, NULL);
}
// থ্রেডের শেষ হওয়া পর্যন্ত অপেক্ষা করা
for (int i = 0; i < 5; i++) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&mutex); // মিউটেক্স ধ্বংস
return 0;
}
এখানে, counter
ভেরিয়েবলটি একাধিক থ্রেড দ্বারা এক্সেস করা হচ্ছে, কিন্তু মিউটেক্স pthread_mutex_lock()
এবং pthread_mutex_unlock()
দ্বারা সিঙ্ক্রোনাইজ করা হয়েছে, যাতে একাধিক থ্রেড একসাথে এই ভেরিয়েবলটি পরিবর্তন করতে না পারে। এর ফলে ডেটার সঠিকতা বজায় থাকে।
pthread_create()
ব্যবহার করে থ্রেড তৈরি করা হয়।pthread_mutex_lock()
এবং pthread_mutex_unlock()
ব্যবহৃত হয়। pthread_mutex_init()
দ্বারা মিউটেক্স ইনিশিয়ালাইজ করা হয় এবং pthread_mutex_destroy()
দ্বারা মিউটেক্স ধ্বংস করা হয়।থ্রেড ব্যবস্থাপনা এবং সিঙ্ক্রোনাইজেশন নিশ্চিত করতে এই কনসেপ্টগুলি অত্যন্ত গুরুত্বপূর্ণ, বিশেষত মাল্টিথ্রেডেড প্রোগ্রামে।
common.read_more