Atomics.load() คืออะไร
ฟังก์ชัน Atomics.load() ใช้สำหรับ อ่านค่า (load) จากตำแหน่งที่กำหนดของ typed array ที่แบ่งปัน (shared typed array) แบบอะตอมิก ฟังก์ชันนี้รับ typed array และตำแหน่ง (index) แล้วคืนค่าที่อยู่ในตำแหน่งนั้น
การใช้ Atomics.load() แทนการเข้าถึงแบบตรงไปตรงมา (arr[index]) รับประกันว่าจะได้ค่าที่อัปเดตล่าสุด (visibility) และไม่มีปัญหา race condition ในสภาพแวดล้อม multi-threaded
ไวยากรณ์ (Syntax)
Atomics.load(typedArray, index)
typedArray- Typed array ที่แบ่งปันindex- ตำแหน่งที่จะอ่านค่า
คืนค่า: ค่าที่อยู่ในตำแหน่ง index ของ typed array
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: การอ่านค่าหลังการบวก
const buffer = new SharedArrayBuffer(16);
const data = new Uint8Array(buffer);
data[0] = 20;
Atomics.add(data, 0, 30); // บวก 30 เข้าไป (ค่าเดิม 20 -> 50)
console.log(Atomics.load(data, 0)); // 50
ตัวอย่างที่ 2: การอ่านค่าหลายครั้ง
const buffer = new SharedArrayBuffer(16);
const data = new Uint8Array(buffer);
data[0] = 3;
console.log(Atomics.add(data, 0, 3)); // ค่าเดิม: 3
console.log(Atomics.load(data, 0)); // ค่าใหม่: 6
ทำไมต้องใช้ Atomics.load()?
ใน JavaScript ปกติ การอ่านค่าจาก typed array (arr[i]) อาจไม่เห็นการเปลี่ยนแปลงที่เธรดอื่นทำไปได้ทันที เนื่องจาก CPU cache และ compiler optimizations การใช้ Atomics.load() บังคับให้:
- อ่านค่าจากหน่วยความจำหลัก (main memory) โดยตรง
- มี memory ordering ที่ถูกต้อง (sequentially consistent)
- เห็นการเขียน (store) จากเธรดอื่นทันที
กรณีพิเศษและข้อผิดพลาด
- โยน
RangeErrorหากindexอยู่นอกขอบเขต - โยน
TypeErrorหากtypedArrayไม่ใช่ typed array ที่รองรับ - หากไม่มีค่าใดถูกเก็บไว้ก่อนหน้า จะคืนค่า 0 (สำหรับ integer typed arrays)