কম্পিউটার টিউটোরিয়াল

C#-এ থ্রেড সিঙ্ক্রোনাইজেশন: lock, Mutex এবং Monitor

মাল্টিথ্রেডেড অ্যাপ্লিকেশনে শেয়ার্ড রিসোর্সে একসাথে অ্যাক্সেস রোধ করতে সিঙ্ক্রোনাইজেশন প্রিমিটিভ ব্যবহার করা হয়। 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("লক পাওয়া যায়নি");
}

তুলনামূলক সারসংক্ষেপ

ফিচারlockMutexMonitor
স্কোপপ্রসেস-ইন্টারনালক্রস-প্রসেসপ্রসেস-ইন্টারনাল
সিনট্যাক্সসহজ (সিনট্যাক্টিক শুগার)এক্সপ্লিসিটএক্সপ্লিসিট
টাইমআউটনা (নেটিভ)হ্যাঁহ্যাঁ (TryEnter)
পারফরম্যান্সদ্রুততমधीম (কার্নেল অবজেক্ট)দ্রুত
রিঅেন্ট্রেন্সিহ্যাঁহ্যাঁহ্যাঁ

সেরা অনুশীলন

  1. সাধারণ কেসে lock ব্যবহার করুন
  2. ক্রস-প্রসেস সিঙ্ক্রোনাইজেশনের জন্য Mutex ব্যবহার করুন
  3. টাইমআউট বা অ্যাডভান্সড কন্ট্রোল দরকার হলে Monitor.TryEnter ব্যবহার করুন
  4. লক অবজেক্ট হয়ে যাওয়া উচিত: private readonly object _lock = new object();
  1. C#-এ থ্রেড (Threads)

  2. C#-এ সিম্পল থ্রেড তৈরি করা

  3. C#-এ থ্রেড किल (Stop) করা

  4. জাভাতে অবজেক্ট লেভেল লক এবং ক্লাস লেভেল লকের পার্থক্য