Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

ฟังก์ชัน Atomics.load() ใน JavaScript

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)