Atomics হল JavaScript এর একটি শক্তিশালী API যা shared memory এবং multithreading প্রসেসের মধ্যে ডেটা সঠিকতা বজায় রাখতে ব্যবহৃত হয়। এই API মূলত SharedArrayBuffer এবং TypedArray এর সাথে কাজ করে, যেখানে একাধিক থ্রেড একই ডেটার উপর কাজ করে এবং atomic operations এর মাধ্যমে ডেটার সঠিকতা নিশ্চিত করা হয়। এখানে কিছু সাধারণ কেস স্টাডি এবং উদাহরণ আলোচনা করা হবে, যেখানে Atomics ব্যবহার করা হয়।
কেস স্টাডি ১: কাউন্টার ইনক্রিমেন্ট (Counter Increment)
ধরা যাক, একাধিক থ্রেড একসাথে একটি কাউন্টার ইনক্রিমেন্ট করছে। এখানে Atomics ব্যবহার করে thread-safe ইনক্রিমেন্ট অপারেশন নিশ্চিত করা হয়েছে, যাতে একাধিক থ্রেড একসাথে কাউন্টার আপডেট করলেও ডেটা কনসিস্টেন্সি বজায় থাকে।
সমস্যা:
একাধিক থ্রেড যখন একই কাউন্টারকে একযোগে ইনক্রিমেন্ট করতে চায়, তখন race condition হতে পারে, অর্থাৎ একাধিক থ্রেডের ইনক্রিমেন্ট অপারেশন একে অপরের উপরে হস্তক্ষেপ করতে পারে।
উদাহরণ:
// Shared memory setup
const sharedBuffer = new SharedArrayBuffer(4);
const typedArray = new Int32Array(sharedBuffer);
// Initial counter value
Atomics.store(typedArray, 0, 0);
// Function to increment counter by multiple threads
function incrementCounter() {
for (let i = 0; i < 1000; i++) {
Atomics.add(typedArray, 0, 1); // Thread-safe increment
}
}
// Create multiple worker threads
const worker1 = new Worker(() => incrementCounter());
const worker2 = new Worker(() => incrementCounter());
worker1.postMessage(sharedBuffer);
worker2.postMessage(sharedBuffer);
worker1.onmessage = worker2.onmessage = () => {
console.log('Counter Value: ', Atomics.load(typedArray, 0)); // Expect 2000 after both threads finish
};
ব্যাখ্যা:
Atomics.add()ফাংশন ব্যবহার করা হয়েছে কাউন্টারটি থ্রেড-সেফভাবে ইনক্রিমেন্ট করতে।- Thread synchronization নিশ্চিত করা হয়েছে যাতে একাধিক থ্রেডের ইনক্রিমেন্ট অপারেশন একে অপরের উপরে হস্তক্ষেপ না করতে পারে।
কেস স্টাডি ২: শেয়ারড মেমোরি অ্যাক্সেস (Shared Memory Access)
ধরা যাক, একটি ওয়েব অ্যাপ্লিকেশন একাধিক থ্রেডের মধ্যে ডেটা শেয়ার করছে এবং একাধিক থ্রেড সেই ডেটা পড়ে ও লেখে। এখানে Atomics.wait() এবং Atomics.notify() ব্যবহার করে থ্রেডগুলোর মধ্যে সমন্বয় রাখা হচ্ছে।
সমস্যা:
একাধিক থ্রেড যখন শেয়ারড ডেটা অ্যাক্সেস করে, তখন data consistency বজায় রাখা গুরুত্বপূর্ণ। কিছু থ্রেড অপেক্ষা করতে পারে, অন্য থ্রেড কাজ শেষ না হওয়া পর্যন্ত।
উদাহরণ:
// Shared memory setup
const sharedBuffer = new SharedArrayBuffer(4);
const typedArray = new Int32Array(sharedBuffer);
// Function to simulate worker waiting for the update
function worker() {
console.log('Waiting for update...');
Atomics.wait(typedArray, 0, 0); // Wait until the value is updated
console.log('Worker received update:', Atomics.load(typedArray, 0));
}
// Function to update shared memory
function updateData() {
setTimeout(() => {
Atomics.store(typedArray, 0, 100); // Update shared data
console.log('Data updated');
Atomics.notify(typedArray, 0); // Notify waiting thread
}, 2000);
}
// Start worker and update data after 2 seconds
worker();
updateData();
ব্যাখ্যা:
Atomics.wait()ব্যবহার করা হয়েছে থ্রেডকে অপেক্ষা করানোর জন্য, যতক্ষণ না ডেটাটি পরিবর্তন না হয়।Atomics.notify()ব্যবহৃত হয়েছে থ্রেডকে জাগিয়ে তোলার জন্য, যখন ডেটা পরিবর্তন হয়।
কেস স্টাডি ৩: মাল্টি-থ্রেডেড অ্যাক্সেস (Multi-Threaded Access to Shared Resource)
ধরা যাক, একটি থ্রেড একটি শেয়ারড ডেটা পরিবর্তন করছে এবং অন্য থ্রেড একই ডেটার উপর অ্যাক্সেস করছে। এখানে Atomics ব্যবহার করে ডেটার thread-safe access নিশ্চিত করা হয়েছে।
সমস্যা:
একাধিক থ্রেড একই রিসোর্স (ডেটা) অ্যাক্সেস করলে data corruption হতে পারে, যেমন যদি একটি থ্রেড কাজ করছে এবং অন্য থ্রেড কাজ শেষ হওয়ার আগেই সেই ডেটা আপডেট করে।
উদাহরণ:
// Shared memory setup
const sharedBuffer = new SharedArrayBuffer(4);
const typedArray = new Int32Array(sharedBuffer);
// Function to simulate multiple workers accessing shared data
function worker1() {
console.log('Worker 1 updating the data...');
Atomics.add(typedArray, 0, 10); // Safe atomic operation
console.log('Worker 1 finished');
}
function worker2() {
console.log('Worker 2 updating the data...');
Atomics.add(typedArray, 0, 20); // Safe atomic operation
console.log('Worker 2 finished');
}
// Start workers
worker1();
worker2();
// Print final value
setTimeout(() => {
console.log('Final value:', Atomics.load(typedArray, 0)); // Expected: 30
}, 1000);
ব্যাখ্যা:
Atomics.add()ব্যবহার করা হয়েছে ডেটার উপর অ্যাটমিক ইনক্রিমেন্ট অপারেশন করার জন্য। একাধিক থ্রেড এটি একে অপরের উপরে হস্তক্ষেপ না করে নিরাপদভাবে করতে পারে।- Thread-safe operations নিশ্চিত করে, যাতে ডেটা ক্রমাগত সঠিক থাকে।
কেস স্টাডি ৪: থ্রেড সিঙ্ক্রোনাইজেশন (Thread Synchronization)
একটি থ্রেড যখন কাজ সম্পন্ন করে এবং অন্য থ্রেড সেই কাজের পরবর্তী স্টেপে চলে, তখন thread synchronization অত্যন্ত গুরুত্বপূর্ণ। এখানে Atomics.wait() এবং Atomics.notify() ব্যবহার করে থ্রেডগুলোর মধ্যে সমন্বয় করা হয়েছে।
সমস্যা:
একটি থ্রেড যদি একটি নির্দিষ্ট কাজের জন্য অপেক্ষা করতে থাকে, তবে কাজটি শেষ হওয়া পর্যন্ত সে থ্রেডটি কাজ শুরু করতে পারবে না।
উদাহরণ:
// Shared memory setup
const sharedBuffer = new SharedArrayBuffer(4);
const typedArray = new Int32Array(sharedBuffer);
// Function for worker to wait until a task is ready
function worker1() {
console.log('Worker 1 waiting...');
Atomics.wait(typedArray, 0, 0); // Wait for worker 2 to complete task
console.log('Worker 1 starts working after notification');
}
// Function for worker 2 to notify worker 1
function worker2() {
console.log('Worker 2 working...');
Atomics.store(typedArray, 0, 1); // Update shared data
Atomics.notify(typedArray, 0); // Notify worker 1
console.log('Worker 2 finished work');
}
// Start workers
worker1();
worker2();
ব্যাখ্যা:
Atomics.wait()থ্রেডকে অপেক্ষা করানোর জন্য ব্যবহার করা হয়, যতক্ষণ না অন্য থ্রেড কাজ সম্পন্ন করে।Atomics.notify()ব্যবহার করে থ্রেডকে জানানো হয় যে কাজ শেষ হয়েছে এবং পরবর্তী থ্রেড কাজ শুরু করতে পারে।
উপসংহার
Atomics API মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে thread synchronization, data consistency, এবং race condition প্রতিরোধের জন্য অত্যন্ত কার্যকর। বিভিন্ন কেস স্টাডি যেমন counter increment, shared memory access, multi-threaded access, এবং thread synchronization এর মাধ্যমে Atomics-এর বাস্তব ব্যবহার এবং সুবিধা পরিষ্কারভাবে বোঝা যায়। এটি Atomic operations ব্যবহার করে ডেটা ম্যানিপুলেশন সঠিকভাবে পরিচালনা করতে সহায়ক, এবং একাধিক থ্রেডের মধ্যে ডেটার সঠিকতা বজায় রাখতে সাহায্য করে।
Read more