Atomics.sub() คืออะไร
วัตถุ Atomics ใน JavaScript เป็นออบเจ็กต์ที่ให้การดำเนินการแบบอะตอมิก (Atomic operations) เช่น add, sub, and, or, xor, load, store เป็นต้น โดยเป็นเมธอดแบบ static ใช้ร่วมกับออบเจ็กต์ SharedArrayBuffer เพื่อให้การเข้าถึงหน่วยความจำร่วมกัน (shared memory) ระหว่างเธรด (threads) เป็นไปอย่างปลอดภัยโดยไม่ต้องใช้ล็อก (locks)
ฟังก์ชัน Atomics.sub() รับค่าตัวเลขและตำแหน่ง (index) แล้วลบค่าที่กำหนดออกจากค่าที่อยู่ในตำแหน่งนั้น และคืนค่า เดิม (old value) ที่อยู่ในตำแหน่งนั้นก่อนการลบ
ไวยากรณ์ (Syntax)
Atomics.sub(typedArray, index, value)
typedArray- อาร์เรย์แบบ typed array เช่นInt32Array,Uint8Arrayเป็นต้นindex- ตำแหน่งในอาร์เรย์ที่จะดำเนินการvalue- ค่าที่จะลบ
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: การลบพื้นฐาน
const buffer = new SharedArrayBuffer(16);
const data = new Uint8Array(buffer);
data[0] = 30;
const oldValue = Atomics.sub(data, 0, 10);
console.log('ค่าเดิม:', oldValue); // 30
console.log('ค่าใหม่:', Atomics.load(data, 0)); // 20
ตัวอย่างที่ 2: การลบหลายครั้งติดต่อกัน
const buffer = new SharedArrayBuffer(16);
const data = new Uint8Array(buffer);
data[0] = 30;
console.log('ก่อนลบครั้งที่ 1:', Atomics.sub(data, 0, 10)); // 30
console.log('หลังลบครั้งที่ 1:', Atomics.load(data, 0)); // 20
console.log('ก่อนลบครั้งที่ 2:', Atomics.sub(data, 0, 5)); // 20
console.log('หลังลบครั้งที่ 2:', Atomics.load(data, 0)); // 15
คุณสมบัติสำคัญ
- Atomicity: การดำเนินการอ่าน-แก้ไข-เขียน (read-modify-write) เกิดขึ้นแบบอะตอมิก ไม่มี race condition
- คืนค่าเก่า: คืนค่าที่อยู่ในตำแหน่งนั้น ก่อน การลบ
- Shared Memory: ทำงานกับ
SharedArrayBufferเพื่อแบ่งปันข้อมูลระหว่าง Web Workers
กรณีพิเศษและข้อผิดพลาด
- หาก
indexอยู่นอกขอบเขตอาร์เรย์ จะโยนRangeError - หาก
typedArrayไม่ใช่ typed array ที่รองรับ จะโยนTypeError - การดำเนินการบน
SharedArrayBufferต้องการการตั้งค่า HTTP headers ให้ถูกต้อง (Cross-Origin-Opener-Policy,Cross-Origin-Embedder-Policy)