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

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

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)