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

C#-এ থ্রেড-সেফ কালেকশন: System.Collections.Concurrent

.NET Framework 4.0-এ System.Collections.Concurrent নামস্পেস চালু করা হয়েছিল, যাতে থ্রেড-সেফ এবং স্কেলেবল কালেকশন ক্লাসগুলো থাকে। এই ক্লাসগুলো মাল্টিপল থ্রেড একসাথে নিরাপদে আইটেম যোগ/মুছে দিতে পারে।

প্রধান কনকারেন্ট কালেকশনগুলো

ক্লাসব্যাখ্যাউপযোগী পরিস্থিতি
BlockingCollection<T>বাউন্ডিং এবং ব্লকিং ফাংশনালিটি সহ যেকোনো টাইপের জন্যপ্রডিউসার-কনসিউমার প্যাটার্ন
ConcurrentDictionary<TKey,TValue>থ্রেড-সেফ কি-ভ্যালু ডিকশনারিক্যাশে, শেয়ার্ড স্টেট ম্যানেজমেন্ট
ConcurrentQueue<T>থ্রেড-সেফ FIFO (First-In-First-Out) কিউটাস্ক কিউ, মেসেজ পাসিং
ConcurrentStack<T>থ্রেড-সেফ LIFO (Last-In-First-Out) স্ট্যাকঅনডো মেকানিজম, ডিপথ-ফার্সট ট্রাভার্সাল
ConcurrentBag<T>থ্রেড-সেফ অনঅর্ডার্ড কালেকশনঅর্ডার গুরুত্বহীন কনকারেন্ট কাজ
IProducerConsumerCollection<T>ব্লকিং কালেকশনে ব্যবহারের ইন্টারফেসকাস্টম কনকারেন্ট কালেকশন বানানোর জন্য

লাইটওয়েট সিঙ্ক্রোনাইজেশন প্রিমিটিভ

.NET 4.0-এ নতুন:

  • SpinLock - খুব ছোট криティিক্যাল সেকশনের জন্য
  • SpinWait - বেসি-ওয়েইটিং এড়াতে স্পিনিং
  • Barrier - ফেজ-বেসড সিঙ্ক্রোনাইজেশন
  • CountdownEvent - সিগন্যালিং প্রিমিটিভ

ConcurrentDictionary উদাহরণ

using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;

var dict = new ConcurrentDictionary<string, int>();

// থ্রেড-সেফ যোগ/আপডেট
dict.TryAdd("key1", 1);
dict.AddOrUpdate("key1", 1, (k, v) => v + 1);

// থ্রেড-সেফ পড়া
if (dict.TryGetValue("key1", out int value))
    Console.WriteLine(value);

// প্যারালেল অ্যাক্সেস টেস্ট
Parallel.For(0, 1000, i => 
{
    dict.AddOrUpdate("counter", 1, (k, v) => v + 1);
});

Console.WriteLine($"ফাইনাল কাউন্ট: {dict["counter"]}"); // 1000 হবে

ConcurrentQueue উদাহরণ (প্রডিউসার-কনসিউমার)

using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;

var queue = new ConcurrentQueue<int>();
var cts = new CancellationTokenSource();

// প্রডিউসার
Task.Run(() => 
{
    for (int i = 0; i < 10; i++)
    {
        queue.Enqueue(i);
        Console.WriteLine($"এনকিউ: {i}");
        Thread.Sleep(100);
    }
    cts.Cancel();
}, cts.Token);

// কনসিউমার
Task.Run(() => 
{
    while (!cts.Token.IsCancellationRequested || !queue.IsEmpty)
    {
        if (queue.TryDequeue(out int item))
            Console.WriteLine($"ডিকিউ: {item}");
        else
            Thread.Sleep(50);
    }
}, cts.Token);

ConcurrentStack উদাহরণ

using System;
using System.Collections.Concurrent;

var stack = new ConcurrentStack<int>();
stack.Push(1);
stack.Push(2);
stack.Push(3);

if (stack.TryPop(out int result))
    Console.WriteLine($"পপ করা: {result}"); // 3

if (stack.TryPeek(out int peeked))
    Console.WriteLine($"পিক করা: {peeked}"); // 2

পারফরম্যান্স টিপস

  • ConcurrentDictionary-এ GetOrAdd, AddOrUpdate অ্যাটমিক অপারেশন ব্যবহার করুন।
  • বড় কালেকশনে ToArray() বা ToList() এড়ান - এনুমেরেশন লক-ফ্রি কিন্তু স্ন্যাপশট নেয়।
  • BlockingCollection ব্যবহার করুন প্রডিউসার-কনসিউমার সিনারিওতে বাউন্ডেড ক্যাপাসিটির জন্য।
  1. জাভাস্ক্রিপ্টে কীড কালেকশনস (Keyed Collections)

  2. জাভাস্ক্রিপ্টে ইনডেক্সড কালেকশনস (Indexed Collections)

  3. জাভাতে Swing থ্রেড-সেফ কি?

  4. মাইক্রোসফট এজ-এ কালেকশন (Collections) ব্যবহার করার পদ্ধতি