Semaphore এবং Mutex হল মাল্টি-থ্রেডেড বা মাল্টি-প্রসেসিং অ্যাপ্লিকেশনে সিঙ্ক্রোনাইজেশন নিশ্চিত করার জন্য ব্যবহৃত দুটি প্রধান কৌশল। এগুলি সঠিকভাবে পরিচালনা করলে থ্রেড বা প্রক্রিয়াগুলির মধ্যে তথ্যের সঠিকতা এবং স্থিতিশীলতা বজায় রাখতে সাহায্য করে। নিচে Semaphore এবং Mutex ব্যবহার করে সিঙ্ক্রোনাইজেশন নিশ্চিত করার পদ্ধতি আলোচনা করা হলো।
Mutex (Mutual Exclusion)
Mutex হল একটি লকিং মেকানিজম যা একসাথে শুধুমাত্র একটি থ্রেডকে একটি নির্দিষ্ট সম্পদ অ্যাক্সেস করতে দেয়। এটি মূলত সিঙ্ক্রোনাইজেশনের জন্য ব্যবহৃত হয় যেখানে একটি সম্পদ বা তথ্যের উপর একাধিক থ্রেডের অ্যাক্সেস নিয়ন্ত্রণ করতে হয়।
ব্যবহার কৌশল
- লক গ্রহণ: একটি থ্রেড যখন সম্পদ অ্যাক্সেস করতে চায়, তখন এটি প্রথমে Mutex লক গ্রহণ করে।
- কাজ করা: লক পাওয়ার পর, থ্রেড সম্পদ অ্যাক্সেস করতে পারে এবং প্রয়োজনীয় কাজ সম্পন্ন করে।
- লক মুক্ত করা: কাজ শেষ হলে, থ্রেড Mutex লক মুক্ত করে, যাতে অন্য থ্রেডগুলি সম্পদে অ্যাক্সেস করতে পারে।
উদাহরণ: Python এ Mutex ব্যবহার
import threading
# Shared resource
shared_counter = 0
mutex = threading.Lock()
def increment():
global shared_counter
for _ in range(100000):
mutex.acquire() # Acquire the lock
shared_counter += 1
mutex.release() # Release the lock
# Creating threads
threads = []
for _ in range(2):
t = threading.Thread(target=increment)
threads.append(t)
t.start()
for t in threads:
t.join()
print(f'Final Counter Value: {shared_counter}')
Semaphore
Semaphore হল একটি সিঙ্ক্রোনাইজেশন পদ্ধতি যা একাধিক থ্রেডের জন্য নির্দিষ্ট সংখ্যক অ্যাক্সেস প্রদান করে। এটি সাধারণত রিসোর্সের সংখ্যা নিয়ন্ত্রণ করার জন্য ব্যবহৃত হয়।
ব্যবহার কৌশল
- সেমাফোর তৈরি: সেমাফোর একটি কাউন্টার সঙ্গে শুরু হয়, যা নির্দেশ করে কতগুলি থ্রেড একই সাথে রিসোর্স অ্যাক্সেস করতে পারবে।
- সেমাফোর গ্রহণ: একটি থ্রেড রিসোর্স অ্যাক্সেস করতে চাইলেই এটি সেমাফোর গ্রহণ করে। যদি কাউন্টার > 0 হয়, তবে এটি সফল হবে এবং কাউন্টার 1 কমে যাবে।
- সেমাফোর মুক্ত করা: কাজ শেষ হলে, থ্রেড সেমাফোর মুক্ত করে, যার ফলে কাউন্টার বাড়ে।
উদাহরণ: Python এ Semaphore ব্যবহার
import threading
import time
# Shared resource
semaphore = threading.Semaphore(2) # Allow 2 threads at a time
def access_resource(thread_id):
print(f'Thread {thread_id} is trying to access the resource.')
with semaphore: # Acquire the semaphore
print(f'Thread {thread_id} has accessed the resource.')
time.sleep(2) # Simulate some work
print(f'Thread {thread_id} has released the resource.')
# Creating threads
threads = []
for i in range(5):
t = threading.Thread(target=access_resource, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()
উদাহরণের ব্যাখ্যা
১. Mutex উদাহরণ:
- এখানে একটি
shared_counterআছে যা দুটি থ্রেড দ্বারা 100,000 বার ইনক্রিমেন্ট করা হয়। - Mutex ব্যবহার করে সঠিকভাবে লক এবং আনলক করে, ডেটার সঠিকতা বজায় রাখা হয়।
২. Semaphore উদাহরণ:
- এখানে একটি সেমাফোর তৈরি করা হয়েছে যা একসঙ্গে দুটি থ্রেডকে একটি রিসোর্স অ্যাক্সেস করতে দেয়।
- পাঁচটি থ্রেড একই রিসোর্স অ্যাক্সেস করার চেষ্টা করে, তবে শুধুমাত্র দুটি থ্রেড একসাথে অ্যাক্সেস করতে সক্ষম হয়।
উপসংহার
Mutex এবং Semaphore উভয়ই থ্রেড সিঙ্ক্রোনাইজেশনের জন্য কার্যকরী টুল। Mutex একক থ্রেডকে সম্পদ অ্যাক্সেস করতে দেয়, যেখানে Semaphore একাধিক থ্রেডকে নির্দিষ্ট সংখ্যক অ্যাক্সেসের অনুমতি দেয়। সঠিকভাবে ব্যবহার করা হলে, এগুলি তথ্যের সঠিকতা এবং সিস্টেমের স্থিতিশীলতা নিশ্চিত করে।
Read more