মাল্টিথ্রেডেড অ্যাপ্লিকেশনে শেয়ার্ড রিসোর্সে একসাথে অ্যাক্সেস রোধ করতে সিঙ্ক্রোনাইজেশন প্রিমিটিভ ব্যবহার করা হয়। C#-এ প্রধানত তিনটি মেকানিজম রয়েছে: lock, Mutex, এবং Monitor।
1. lock স্টেটমেন্ট (সর্বাধিক ব্যবহৃত)
lock হলো Monitor.Enter/Exit-এর সিনট্যাক্টিক শुগার। এটি একটি অবজেক্টের উপর এক্সক্লুসিভ লক নেয়।
public class ThreadSafeCounter
{
private readonly object _lock = new object();
private int _count = 0;
public void Increment()
{
lock (_lock) // শুধু একটি থ্রেড এন্টার করতে পারে
{
_count++;
}
}
public int GetCount()
{
lock (_lock)
{
return _count;
}
}
}
lock-এর নির্দেশনা
- লক অবজেক্ট অবশ্যই
private readonlyরেফারেন্স টাইপ হতে হবে this,typeof(MyClass), বা স্ট্রিং লিটারেল লক করবেন না- ক্রিটিক্যাল সেকশন যতটা সম্ভব ছোট রাখুন
2. Mutex ক্লাস (ইন্টার-প্রসেস সিঙ্ক্রোনাইজেশন)
Mutex (Mutual Exclusion) প্রসেস জুড়েও কাজ করে। এপ্লিকেশন সিঙ্গেলটন এনফোর্স করতে ব্যবহৃত হয়।
বেসিক Mutex উদাহরণ
using System;
using System.Threading;
public class MutexExample
{
private static Mutex _mutex = new Mutex(false, "MyAppMutex");
public static void Main()
{
Console.WriteLine("Mutex অপেক্ষা করছে...");
// লক অর্জন করুন (টাইমআউট দিন)
if (_mutex.WaitOne(TimeSpan.FromSeconds(5)))
{
try
{
Console.WriteLine("Mutex অর্জিত! ক্রিটিক্যাল সেকশনে এন্টার করলাম।");
Console.WriteLine("এন্টার চাপুন মুক্ত করতে...");
Console.ReadLine();
}
finally
{
_mutex.ReleaseMutex();
Console.WriteLine("Mutex মুক্ত করা হয়েছে।");
}
}
else
{
Console.WriteLine("Mutex অর্জন করা যায়নি (টাইমআউট)। অন্য ইনস্ট্যান্স চলছে।");
}
}
}
সিঙ্গেলটন এপ্লিকেশন এনফোর্স করা
static bool _isFirstInstance;
static Mutex _appMutex = new Mutex(true, "MyUniqueAppName", out _isFirstInstance);
if (!_isFirstInstance)
{
MessageBox.Show("অ্যাপ্লিকেশন ইতিমধ্যে চলছে!");
return;
}
// অ্যাপ্লিকেশন লজিক এখানে
// ...
_appMutex.ReleaseMutex();
3. Monitor ক্লাস (নিম্ন-স্তরের কন্ট্রোল)
lock এর অধিক কন্ট্রোল দেয়, যেমন TryEnter টাইমআউটসহ।
object _lock = new object();
if (Monitor.TryEnter(_lock, TimeSpan.FromSeconds(2)))
{
try
{
// ক্রিটিক্যাল সেকশন
}
finally
{
Monitor.Exit(_lock);
}
}
else
{
Console.WriteLine("লক পাওয়া যায়নি");
}
তুলনামূলক সারসংক্ষেপ
| ফিচার | lock | Mutex | Monitor |
|---|---|---|---|
| স্কোপ | প্রসেস-ইন্টারনাল | ক্রস-প্রসেস | প্রসেস-ইন্টারনাল |
| সিনট্যাক্স | সহজ (সিনট্যাক্টিক শুগার) | এক্সপ্লিসিট | এক্সপ্লিসিট |
| টাইমআউট | না (নেটিভ) | হ্যাঁ | হ্যাঁ (TryEnter) |
| পারফরম্যান্স | দ্রুততম | धीম (কার্নেল অবজেক্ট) | দ্রুত |
| রিঅেন্ট্রেন্সি | হ্যাঁ | হ্যাঁ | হ্যাঁ |
সেরা অনুশীলন
- সাধারণ কেসে
lockব্যবহার করুন - ক্রস-প্রসেস সিঙ্ক্রোনাইজেশনের জন্য
Mutexব্যবহার করুন - টাইমআউট বা অ্যাডভান্সড কন্ট্রোল দরকার হলে
Monitor.TryEnterব্যবহার করুন - লক অবজেক্ট হয়ে যাওয়া উচিত:
private readonly object _lock = new object();