Atomics ব্যবহার করে প্র্যাকটিক্যাল অ্যাপ্লিকেশন তৈরি করা

Atomics এর বাস্তব জীবনের উদাহরণ এবং প্রজেক্ট - অ্যাটমিক্স (Atomics) - Web Development

259

Atomics API ব্যবহার করে প্র্যাকটিক্যাল অ্যাপ্লিকেশন তৈরি করা একটি কার্যকরী উপায় হতে পারে মাল্টি-থ্রেডেড পরিবেশে thread-safe অপারেশন পরিচালনা করার জন্য। এটি বিশেষ করে যখন একাধিক থ্রেড একই মেমোরি বা ডেটা শেয়ার করে তখন সঠিকতার সাথে কাজ করতে সাহায্য করে।

এই টিউটোরিয়ালে, আমরা দেখব কিভাবে Atomics API ব্যবহার করে একটি multithreaded counter application তৈরি করা যায়, যেখানে একাধিক থ্রেড একটি শেয়ার করা কন্ট্রোলার ভেরিয়েবলে মান যোগ করবে এবং এই থ্রেডগুলো একে অপরের সাথে প্রতিযোগিতা করবে না।


প্র্যাকটিক্যাল অ্যাপ্লিকেশন: Multithreaded Counter Application

এই অ্যাপ্লিকেশনটি একটি সহজ counter তৈরি করবে, যেখানে একাধিক worker থ্রেড Atomics.add() মেথড ব্যবহার করে counter ভেরিয়েবলটি বাড়াবে। Atomics এর মাধ্যমে প্রতিটি থ্রেড তার অপারেশন সম্পূর্ণ করার আগে অন্য থ্রেডকে হস্তক্ষেপ করতে দেবে না।

প্রকল্পের কাঠামো:

  1. Main Thread: এটি শেয়ার করা মেমোরি তৈরি করবে এবং থ্রেডগুলোকে কাজ শুরু করতে পাঠাবে।
  2. Worker Thread: প্রতিটি worker থ্রেড Atomics.add() ব্যবহার করে কন্ট্রোলারের মান বৃদ্ধি করবে।
  3. Thread-Safe Operation: Atomics নিশ্চিত করবে যে একাধিক থ্রেড একে অপরের কাজের মধ্যে হস্তক্ষেপ করবে না।

কোড উদাহরণ

1. Main Thread (মেইন থ্রেড)

// Shared memory তৈরি
const sharedBuffer = new SharedArrayBuffer(4); // 4 বাইট (একটি Int32Array এর জন্য)
const typedArray = new Int32Array(sharedBuffer); // 32-বিট সাইজের টাইপড অ্যারে

// কন্ট্রোলার ভেরিয়েবল সেট করা (প্রথমে 0)
Atomics.store(typedArray, 0, 0);

// Worker function যা কন্ট্রোলারে মান যোগ করবে
function worker() {
    for (let i = 0; i < 1000; i++) {
        Atomics.add(typedArray, 0, 1); // Counter ভেরিয়েবলে ১ যোগ করা
    }
}

// থ্রেডগুলো তৈরি করা
let threads = [];
for (let i = 0; i < 4; i++) {
    threads.push(new Worker(worker));
}

// সব থ্রেড চালানো
threads.forEach(thread => thread.postMessage(sharedBuffer));

// সব থ্রেডের শেষ হওয়া পর্যন্ত অপেক্ষা করা
Promise.all(threads.map(thread => new Promise(resolve => thread.onmessage = resolve))).then(() => {
    console.log(`Final Counter Value: ${Atomics.load(typedArray, 0)}`);
});

2. Worker Thread (ওয়ার্কার থ্রেড)

onmessage = function(event) {
    const sharedBuffer = event.data;
    const typedArray = new Int32Array(sharedBuffer);

    // 1000 বার কন্ট্রোলার ভেরিয়েবল বাড়ানো
    for (let i = 0; i < 1000; i++) {
        Atomics.add(typedArray, 0, 1); // Counter বাড়ানো
    }

    postMessage('done'); // কাজ শেষ হলে মেইন থ্রেডকে জানানো
};

ব্যাখ্যা:

  1. SharedArrayBuffer এবং TypedArray:
    • এখানে আমরা একটি SharedArrayBuffer তৈরি করেছি যা একাধিক থ্রেডের মধ্যে শেয়ার করা মেমোরি বরাদ্দ করবে।
    • এরপর Int32Array ব্যবহার করে আমরা ৪-বাইট সাইজের একটি অ্যারে তৈরি করেছি, যা atomic operations পরিচালনা করার জন্য প্রস্তুত।
  2. Atomics.add():
    • এখানে Atomics.add() মেথড ব্যবহার করে প্রতিটি worker থ্রেড ১ করে কন্ট্রোলার ভেরিয়েবলে মান যোগ করবে।
    • Atomics.add() নিশ্চিত করবে যে একাধিক থ্রেড একই সময় একই ডেটা পরিবর্তন করার চেষ্টা করলে তা সঠিকভাবে ঘটবে এবং কোনও race condition ঘটবে না।
  3. Worker Thread:
    • Worker থ্রেডগুলোর মধ্যে প্রতিটি থ্রেড একটি নির্দিষ্ট সংখ্যক (1000) বার Atomics.add() ব্যবহার করে কাউন্টার ভেরিয়েবলকে বাড়াবে।
    • প্রতিটি worker থ্রেড কাজ শেষ করার পর মেইন থ্রেডে একটি বার্তা পাঠাবে।
  4. Promise.all():
    • Promise.all() ব্যবহার করে মেইন থ্রেড সব worker থ্রেডের সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করবে। এরপর Atomics.load() ব্যবহার করে শেয়ার করা মেমোরি থেকে ফাইনাল কন্ট্রোলার ভেরিয়েবলের মান পড়া হবে এবং কনসোলে দেখানো হবে।

প্রাপ্ত ফলাফল:

  • Final Counter Value: মোট ৪টি worker থ্রেড প্রত্যেকে ১০০০ বার করে কন্ট্রোলারে মান যোগ করবে, ফলে মোট ৪০০০ হওয়া উচিত।

Output Example:

Final Counter Value: 4000

কিভাবে কাজ করছে Atomics:

  • Thread-Safe Operation: Atomics.add() মেথড ব্যবহার করে, প্রতিটি worker থ্রেড একযোগে কন্ট্রোলার ভেরিয়েবলে মান যোগ করছে। Atomics API নিশ্চিত করে যে একটি থ্রেডের অপারেশন সম্পন্ন হওয়ার আগে অন্য থ্রেড এর মধ্যে হস্তক্ষেপ করতে পারবে না, ফলে race conditions এড়ানো হয়।
  • Synchronization: একাধিক থ্রেডের মধ্যে সিঙ্ক্রোনাইজেশন নিশ্চিত করার জন্য SharedArrayBuffer এবং Atomics ব্যবহার করা হয়।

Atomics ব্যবহার করে আরও প্র্যাকটিক্যাল অ্যাপ্লিকেশন

  1. Web Workers with Shared Memory: বড় ডেটাসেট বা সিমুলেশন চালানোর সময় মাল্টি-থ্রেড ব্যবহার করা।
  2. Parallel Computation: বড় সংখ্যক গণনা বা পরিসংখ্যান হিসাব করার সময়।
  3. Real-time Data Processing: যেমন, গেম ডেভেলপমেন্টে বা ফাইনান্স বা স্টক মার্কেট ডেটা প্রক্রিয়া করা।
  4. Distributed Systems: একাধিক সার্ভারে কাজ করা ডেটা সিঙ্ক্রোনাইজ করা।

উপসংহার:

Atomics API মাল্টি-থ্রেডেড অ্যাপ্লিকেশন তৈরির জন্য একটি শক্তিশালী টুল, বিশেষ করে যখন একাধিক থ্রেড একে অপরের সাথে শেয়ার করা মেমোরি ব্যবহার করে। এটি thread-safe operations, race conditions প্রতিরোধ এবং high-performance নিশ্চিত করতে সাহায্য করে। Atomics ব্যবহার করে একটি কার্যকরী multithreaded counter application তৈরি করা সম্ভব, যেখানে অনেক থ্রেড একযোগে ডেটা প্রক্রিয়া করবে, এবং সঠিক সিঙ্ক্রোনাইজেশন নিশ্চিত হবে।

Content added By
Promotion

Are you sure to start over?

Loading...