Threads এবং Message Passing

Concurrency এবং Multithreading (কনকারেন্সি এবং মাল্টিথ্রেডিং) - রাস্ট (Rust) - Computer Programming

520

Threads (থ্রেডস)

রাস্টে, threads একটি প্রক্রিয়ার (process) মধ্যে একাধিক একক কার্যকলাপ (execution units) তৈরি করতে সক্ষম, যা একে মাল্টি-থ্রেডেড (multi-threaded) অ্যাপ্লিকেশন তৈরি করার অনুমতি দেয়। এটি প্যারালাল প্রসেসিং এবং কনকারেন্ট প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়, যেখানে একাধিক কাজ একসাথে চলতে পারে।

Threads in Rust

রাস্টে থ্রেডস ব্যবহারের জন্য std::thread মডিউল ব্যবহার করা হয়। থ্রেড তৈরি করার জন্য thread::spawn ফাংশন ব্যবহার করা হয়, যা একটি নতুন থ্রেড শুরু করে এবং একটি ক্লোজার অথবা ফাংশন দেয় যা সেই থ্রেডে চলবে।

উদাহরণ:

use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        for i in 1..5 {
            println!("Child thread: {}", i);
        }
    });

    for i in 1..5 {
        println!("Main thread: {}", i);
    }

    handle.join().unwrap(); // মূল থ্রেড অপেক্ষা করবে যে চাইল্ড থ্রেড কাজ শেষ করবে
}

এখানে, thread::spawn একটি নতুন থ্রেড তৈরি করে এবং সেই থ্রেডে কোড চলতে থাকে। join() ফাংশন ব্যবহার করে মূল থ্রেড (main thread) অপেক্ষা করবে যে চাইল্ড থ্রেড কাজ শেষ করবে। যদি join() ব্যবহার না করা হয়, তাহলে মূল থ্রেড তাড়াতাড়ি শেষ হয়ে যেতে পারে, যার ফলে চাইল্ড থ্রেডের কাজ সমাপ্ত হওয়ার আগে প্রোগ্রামটি শেষ হয়ে যেতে পারে।

Multithreading and Data Sharing

রাস্টের থ্রেড ব্যবস্থাপনা ownership এবং borrowing মডেল অনুসরণ করে, যা মেমোরি সেফটি নিশ্চিত করে। থ্রেডগুলোর মধ্যে ডেটা শেয়ার করার জন্য রেফারেন্স পাস করা যায়, তবে সুরক্ষা নিশ্চিত করতে Mutex এবং Arc ব্যবহার করা হয়।


Message Passing (মেসেজ পাসিং)

রাস্টে থ্রেডের মধ্যে যোগাযোগ বা ডেটা শেয়ার করার একটি সাধারণ পদ্ধতি হল Message Passing। এটি থ্রেডগুলোর মধ্যে নিরাপদভাবে তথ্য আদান-প্রদান করার একটি পদ্ধতি, যেখানে এক থ্রেড অন্য থ্রেডকে মেসেজ পাঠায় এবং থ্রেডগুলোর মধ্যে ডেটা শেয়ারিং সুরক্ষিত থাকে।

রাস্টে মেসেজ পাসিং এর জন্য channels ব্যবহৃত হয়। Channels এক ধরনের FIFO (First-In-First-Out) কিউ প্রদান করে, যা এক থ্রেডের পাঠানো মেসেজ অন্য থ্রেড গ্রহণ করতে পারে।

Channels in Rust

রাস্টে channels তৈরি করা যায় std::sync::mpsc (multiple producer, single consumer) মডিউল ব্যবহার করে। mpsc::channel ফাংশন ব্যবহার করে একটি চ্যানেল তৈরি করা হয়, যা একটি sender এবং receiver প্রদান করে।

উদাহরণ:

use std::thread;
use std::sync::mpsc;

fn main() {
    // চ্যানেল তৈরি করা
    let (tx, rx) = mpsc::channel();

    // একটি নতুন থ্রেড তৈরি করা
    thread::spawn(move || {
        let message = String::from("Hello from thread!");
        tx.send(message).unwrap(); // মেসেজ পাঠানো
    });

    // মেসেজ গ্রহণ করা
    let received_message = rx.recv().unwrap();
    println!("Received: {}", received_message);
}

এখানে:

  • mpsc::channel() একটি চ্যানেল তৈরি করে, যা একটি tx (sender) এবং rx (receiver) প্রদান করে।
  • tx.send(message) মেসেজ পাঠানোর জন্য ব্যবহার করা হয়।
  • rx.recv() মেসেজ গ্রহণ করার জন্য ব্যবহার করা হয়।

মেসেজ পাসিং একটি গুরুত্বপূর্ণ পদ্ধতি, কারণ এটি থ্রেডের মধ্যে ডেটা শেয়ার করার সময় ownership নিয়মগুলো পালন করে, এবং ডেটা রেস (data races) এবং মেমোরি নিরাপত্তা সমস্যা এড়ায়।


Threads এবং Message Passing এর মধ্যে সম্পর্ক

  • Threads একাধিক কার্যকলাপ (execution units) তৈরি করতে সক্ষম, যা মাল্টি-থ্রেডেড প্রোগ্রামিংয়ের জন্য উপকারী।
  • Message Passing থ্রেডগুলোর মধ্যে যোগাযোগের একটি নিরাপদ পদ্ধতি যেখানে ডেটা এক থ্রেড থেকে অন্য থ্রেডে মেসেজের মাধ্যমে পাস করা হয়।
  • মেসেজ পাসিং থ্রেডগুলোর মধ্যে ownership নিয়ম মেনে চলতে সহায়তা করে, এবং data races এবং memory safety সমস্যা এড়ানোর জন্য গুরুত্বপূর্ণ।

Mutex এবং Arc: Thread Safety with Shared Data

যখন একাধিক থ্রেড একযোগভাবে একে অপরের সাথে কাজ করে, তখন mutex এবং Arc ব্যবহার করা হয় ডেটা সুরক্ষিত রাখতে।

  • Mutex (Mutual Exclusion): এটি একটি সিঙ্ক্রোনাইজেশন প্রিমিটিভ, যা একে একে থ্রেডগুলিকে একটি ডেটা সম্পদ অ্যাক্সেস করতে দেয়।
  • Arc (Atomic Reference Counted): এটি থ্রেডের মধ্যে শেয়ারযোগ্য ডেটা ব্যবস্থাপনার জন্য ব্যবহার করা হয়।

উদাহরণ:

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let counter = Arc::new(Mutex::new(0));

    let mut handles = vec![];

    for _ in 0..10 {
        let counter = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            let mut num = counter.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Result: {}", *counter.lock().unwrap());
}

এখানে:

  • Arc ডেটা শেয়ার করার জন্য ব্যবহৃত হচ্ছে এবং এটি বিভিন্ন থ্রেডে ব্যবহার করার জন্য সুরক্ষিত।
  • Mutex ব্যবহৃত হচ্ছে ডেটা অ্যাক্সেসের সময় থ্রেডগুলোর মধ্যে একে একে অ্যাক্সেস নিশ্চিত করতে।

সারাংশ

  • Threads থ্রেডের মাধ্যমে একাধিক কার্যকলাপ চালানো সম্ভব করে এবং একাধিক কাজ একসাথে সম্পাদন করতে সাহায্য করে।
  • Message Passing থ্রেডগুলোর মধ্যে নিরাপদভাবে তথ্য আদান-প্রদান করার একটি পদ্ধতি, যা ডেটা রেস এবং মেমোরি সেফটি সমস্যাগুলি এড়াতে সহায়ক।
  • Mutex এবং Arc ব্যবহার করে শেয়ার করা ডেটা নিরাপদভাবে একাধিক থ্রেডের মধ্যে অ্যাক্সেস করা যেতে পারে।
Content added By
Promotion

Are you sure to start over?

Loading...