সেমাফোর হলো প্রসেস বা থ্রেড সিঙ্ক্রোনাইজেশনের একটি কনসেপ্ট। এখানে আমরা বাস্তব প্রোগ্রামে সেমাফোর কীভাবে ব্যবহার করতে হয় তা দেখব।
লিনাক্স সিস্টেমে POSIX সেমাফোর লাইব্রেরি পাওয়া যায়। এটি ব্যবহার করতে `semaphore.h` লাইব্রেরি ইনক্লুড করতে হয়। কোড কম্পাইল করার সময় নিচের অপশনগুলো ব্যবহার করতে হয়:
gcc program_name.c -lpthread -lrt
লক বা অপেক্ষা করার জন্য `sem_wait()` এবং লক রিলিজ করার জন্য `sem_post()` ব্যবহার করা হয়। সেমাফোর ইনিশিয়ালাইজ করতে `sem_init()` বা ইন্টার-প্রসেস কমিউনিকেশন (IPC) এর জন্য `sem_open()` ব্যবহার করা হয়।
উদাহরণ
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t mutex;
void* thread(void* arg) { // থ্রেডের মত কাজ করার ফাংশন
sem_wait(&mutex); // অপেক্ষা অবস্থা
printf("\nEntered into the Critical Section..\n");
sleep(3); // ক্রিটিক্যাল সেকশন
printf("\nCompleted...\n"); // ক্রিটিক্যাল সেকশন থেকে বের होना
sem_post(&mutex);
}
int main() {
sem_init(&mutex, 0, 1);
pthread_t th1, th2;
pthread_create(&th1, NULL, thread, NULL);
sleep(2);
pthread_create(&th2, NULL, thread, NULL);
// মেইন থ্রেডের সাথে থ্রেডগুলো জয়েন করা
pthread_join(th1, NULL);
pthread_join(th2, NULL);
sem_destroy(&mutex);
}
আউটপুট
soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$ gcc 1270.posix_semaphore.c -lpthread -lrt
1270.posix_semaphore.c:19:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
main() {
^~~~
soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$ ./a.out
Entered into the Critical Section..
Completed...
Entered into the Critical Section..
Completed...
soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$