মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে Data Consistency (ডেটার সঠিকতা) বজায় রাখা অত্যন্ত গুরুত্বপূর্ণ। একাধিক থ্রেড যখন একই সময়ে একই ডেটার উপর কাজ করে, তখন ডেটা কনসিস্টেন্সি নষ্ট হতে পারে। Atomics API মাল্টি-থ্রেডিংয়ে atomic operations এর মাধ্যমে ডেটা কনসিস্টেন্সি নিশ্চিত করে।
Data Consistency এবং মাল্টি-থ্রেডিং
Data Consistency কী?
ডেটা কনসিস্টেন্সি হল এমন একটি অবস্থা যেখানে ডেটা সব থ্রেডের কাছে সর্বদা সঠিক এবং নির্ভুল থাকে। মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে একাধিক থ্রেড যখন একই ডেটা পড়ে বা পরিবর্তন করে, তখন ডেটা সঠিক না থাকলে Race Condition, Data Corruption, এবং Incorrect Results এর মতো সমস্যা হতে পারে।
মাল্টি-থ্রেডিংয়ে সমস্যা
একাধিক থ্রেড একই ডেটার উপর কাজ করলে নিম্নলিখিত সমস্যাগুলি হতে পারে:
- এক থ্রেড ডেটা পরিবর্তন করার সময় অন্য থ্রেড সেই পরিবর্তিত ডেটা পড়তে পারে না।
- একই ডেটাতে একাধিক থ্রেড পরিবর্তন আনতে গিয়ে ডেটা কনসিস্টেন্সি নষ্ট হতে পারে।
- ডেটার ভুল মান বা inconsistent state তৈরি হয়।
Atomics এর মাধ্যমে Data Consistency বজায় রাখা
Atomics API এমন কিছু অপারেশন সরবরাহ করে যা atomic বা অখণ্ড। এই অপারেশনগুলো নিশ্চিত করে যে, একাধিক থ্রেড ডেটার উপর কাজ করলেও ডেটা সবসময় সঠিক অবস্থায় থাকে। Atomics ব্যবহার করে নিম্নলিখিত উপায়ে ডেটা কনসিস্টেন্সি নিশ্চিত করা যায়:
Atomic Reads এবং Writes
Atomics API এর মাধ্যমে ডেটা পড়া (read) এবং লেখা (write) দুটি থ্রেড-সেফ অপারেশনের মাধ্যমে সম্পন্ন হয়।
উদাহরণ:
const sharedBuffer = new SharedArrayBuffer(1024); // শেয়ার করা মেমোরি
const typedArray = new Int32Array(sharedBuffer);
// Atomics.store: ডেটা সেভ করা
Atomics.store(typedArray, 0, 42); // Index 0 তে 42 সেভ করা
// Atomics.load: ডেটা পড়া
const value = Atomics.load(typedArray, 0);
console.log(value); // আউটপুট: 42
Atomic Updates
Atomics অপারেশন ডেটাকে নির্ভুলভাবে আপডেট করতে সাহায্য করে, যেখানে ডেটা পরিবর্তন করার সময় কোনো থ্রেডের হস্তক্ষেপ হয় না।
উদাহরণ:
// Atomics.add ব্যবহার করে ডেটা আপডেট
Atomics.add(typedArray, 0, 10); // Index 0 এর মান 10 যোগ করা
console.log(Atomics.load(typedArray, 0)); // আউটপুট: 52
Thread Synchronization
Atomics API এর Atomics.wait() এবং Atomics.notify() ফাংশন থ্রেডগুলোর মধ্যে ডেটা সিঙ্ক্রোনাইজ করতে ব্যবহার করা হয়।
উদাহরণ:
// থ্রেড অপেক্ষা করবে যতক্ষণ পর্যন্ত ডেটা পরিবর্তন না হয়
Atomics.wait(typedArray, 0, 52); // Index 0 এর মান 52 হলে থ্রেড জাগবে
// নতুন মান সেট করা হলে অন্য থ্রেডকে জাগানো
Atomics.store(typedArray, 0, 100);
Atomics.notify(typedArray, 0); // থ্রেডকে জাগানো
Atomics এর মাধ্যমে Data Consistency বজায় রাখার সুবিধা
- Thread-Safe Operations: একাধিক থ্রেড কাজ করলেও ডেটা সঠিক থাকে।
- Race Condition প্রতিরোধ: একাধিক থ্রেড একই সময়ে ডেটা পরিবর্তন করলেও ডেটা কনসিস্টেন্সি বজায় থাকে।
- Synchronization Mechanism: থ্রেডগুলোর মধ্যে কার্যকর সমন্বয় তৈরি হয়।
- Non-blocking Operations: Atomics ব্যবহার করে লক-মুক্ত (lock-free) অপারেশন সম্ভব।
উদাহরণ: Atomics এর মাধ্যমে Data Consistency
const sharedBuffer = new SharedArrayBuffer(1024);
const typedArray = new Int32Array(sharedBuffer);
// থ্রেড ১: ডেটা আপডেট করা
function thread1() {
Atomics.store(typedArray, 0, 42); // ডেটা সেভ
Atomics.add(typedArray, 0, 10); // 10 যোগ করা
console.log('Thread 1:', Atomics.load(typedArray, 0)); // আউটপুট: 52
}
// থ্রেড ২: ডেটা পড়া
function thread2() {
console.log('Thread 2 Waiting...');
Atomics.wait(typedArray, 0, 42); // ডেটা পরিবর্তনের জন্য অপেক্ষা
console.log('Thread 2:', Atomics.load(typedArray, 0)); // আউটপুট: 52
}
thread1();
thread2();
Atomics এর সীমাবদ্ধতা
- শুধুমাত্র SharedArrayBuffer এবং TypedArray এর সাথে কাজ করে।
- High Overhead: জটিল অপারেশনগুলো কিছু সময় বেশি প্রসেসিং সময় নিতে পারে।
- Browser Compatibility: কিছু ব্রাউজারে Atomics এবং SharedArrayBuffer সমর্থন সীমিত।
সারাংশ
Atomics API মাল্টি-থ্রেডিংয়ের ক্ষেত্রে Data Consistency বজায় রাখার জন্য একটি কার্যকর পদ্ধতি। এটি থ্রেডগুলোর মধ্যে race conditions এবং data corruption এড়িয়ে ডেটার উপর সঠিক এবং থ্রেড-সেফ অপারেশন সম্পন্ন করতে সাহায্য করে। মাল্টি-থ্রেডেড অ্যাপ্লিকেশনগুলোর সঠিকতা ও কার্যক্ষমতা উন্নত করতে এটি অপরিহার্য।
Read more