WebAssembly (WASM) for High Performance Apps · Pelajaran

Memori Bersama & Operasi Atomik

Jelajahi penggunaan SharedArrayBuffer dan operasi atomik untuk akses data konkuren berkinerja tinggi antara WASM dan JS.

Pelajaran 3 dari 412 langkah

Memori Bersama & Operasi Atomik adalah pelajaran WebAssembly (WASM) for High Performance Apps gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar WebAssembly (WASM) for High Performance Apps, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus WebAssembly (WASM) for High Performance Apps mencakup 4 pelajaran total.

Bagian dari pelajaran ini belum diterjemahkan dan ditampilkan dalam bahasa Inggris.

Concurrency & Shared Memory

When building high-performance applications, especially with WebAssembly, you often need to perform tasks concurrently. This means running parts of your code in parallel, perhaps across different threads.

For these concurrent tasks to work together efficiently, they often need to access and modify the same data. This is where shared memory comes in.

Why Not Just ArrayBuffer?

You might already know about ArrayBuffer for handling raw binary data in JavaScript. However, a standard ArrayBuffer cannot be directly shared between different execution contexts (like the main thread and a Web Worker, or between JavaScript and a WebAssembly thread).

Each context would get its own copy of the data, which is inefficient and complicated to synchronize for frequent updates.

Introducing SharedArrayBuffer

The solution for true concurrent data access is SharedArrayBuffer. It's a special type of ArrayBuffer that allows the same memory block to be accessed by multiple threads simultaneously.

This means your JavaScript main thread, Web Workers, and WebAssembly modules can all read from and write to the *exact same* underlying data, enabling efficient communication and complex parallel computations.

Security Headers for Sharing

Due to security vulnerabilities (like Spectre), using SharedArrayBuffer requires specific HTTP response headers to be set by the server:

  • Cross-Origin-Opener-Policy: same-origin
  • Cross-Origin-Embedder-Policy: require-corp

These headers ensure that the document is in an isolated, cross-origin isolated browsing context, which is necessary for SharedArrayBuffer to function securely.

Creating SharedArrayBuffer in JS

Creating a SharedArrayBuffer is similar to creating a regular ArrayBuffer. You specify the size in bytes. Then, you can create a typed array view (like Int32Array) to easily interact with the memory.

const sharedBuffer = new SharedArrayBuffer(1024); // 1KB
const sharedArray = new Int32Array(sharedBuffer);

console.log("Shared buffer created!");
console.log("Size:", sharedArray.length * Int32Array.BYTES_PER_ELEMENT, "bytes");

WASM's View of Shared Memory

When a SharedArrayBuffer is passed to a WebAssembly module (e.g., via WebAssembly.Memory), WASM can map this memory into its own linear memory space. This allows WASM code to directly read and write to the shared data.

This direct access is key for performance, as it avoids costly data copying between the host environment (JavaScript) and the WASM module.

Race Conditions & Data Safety

While sharing memory is powerful, it introduces a challenge: race conditions. If multiple threads try to read and write to the same memory location at the same time, the final result can be unpredictable or incorrect.

Imagine two threads trying to increment a counter simultaneously. Without proper synchronization, one update might overwrite another, leading to a wrong count.

Introducing Atomics for Safety

To prevent race conditions, JavaScript provides the Atomics object. Atomics offer a set of operations that are guaranteed to be atomic, meaning they are indivisible.

An atomic operation either completes entirely or doesn't happen at all, ensuring that no other thread can interrupt it. This guarantees data integrity in shared memory.

Atomic Reads and Writes

The most basic atomic operations are `Atomics.load()` and `Atomics.store()`. These methods ensure that reading and writing values to a shared memory location happens as a single, uninterruptible step.

const sharedBuffer = new SharedArrayBuffer(4); // 4 bytes
const int32View = new Int32Array(sharedBuffer);

// Safely store a value at index 0
Atomics.store(int32View, 0, 100);
console.log("Stored 100 atomically.");

// Safely load a value from index 0
const value = Atomics.load(int32View, 0);
console.log("Loaded value:", value);

Atomic Arithmetic Operations

Beyond simple reads/writes, Atomics provide arithmetic operations like Atomics.add(), Atomics.sub(), Atomics.and(), etc. These perform an operation and update the value atomically.

Atomics.add(typedArray, index, value) adds value to the element at index and returns the old value at that index, all in one safe step.

const sharedBuffer = new SharedArrayBuffer(4);
const int32View = new Int32Array(sharedBuffer);
Atomics.store(int32View, 0, 5); // Initial value

console.log("Initial value:", Atomics.load(int32View, 0));

// Atomically add 3 to the value at index 0
const oldValue = Atomics.add(int32View, 0, 3);
console.log("Old value before add:", oldValue);
console.log("New value after add:", Atomics.load(int32View, 0));

Shared Memory Check

Consider the following JavaScript code snippet. Assume sharedBuffer is a properly configured SharedArrayBuffer and int32View is an Int32Array view of it.

const int32View = new Int32Array(sharedBuffer);
Atomics.store(int32View, 0, 5);
const result = Atomics.add(int32View, 0, 2);
const finalValue = Atomics.load(int32View, 0);

Recap: Shared Memory & Atomics

We've explored how SharedArrayBuffer enables efficient concurrent data access between JavaScript and WebAssembly by allowing multiple threads to access the same memory block.

To prevent data corruption from race conditions, we learned about Atomics, which provide safe, indivisible operations for reading, writing, and modifying data in shared memory.

These tools are crucial for building high-performance, multithreaded WebAssembly applications.

Gratis untuk memulai

Belajar WebAssembly (WASM) for High Performance Apps dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
12
Pelajaran
48

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Memori Bersama & Operasi Atomik” gratis?

Ya — teks lengkap “Memori Bersama & Operasi Atomik” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus WebAssembly (WASM) for High Performance Apps, upgrade ke CoddyKit PRO. Kursus WebAssembly (WASM) for High Performance Apps mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Memori Bersama & Operasi Atomik”?

Jelajahi penggunaan SharedArrayBuffer dan operasi atomik untuk akses data konkuren berkinerja tinggi antara WASM dan JS. Kamu berlatih WebAssembly (WASM) for High Performance Apps dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai WebAssembly (WASM) for High Performance Apps?

Tidak diperlukan pengalaman sebelumnya. WebAssembly (WASM) for High Performance Apps di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Memori Bersama & Operasi Atomik” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran WebAssembly (WASM) for High Performance Apps ini?

Ya. Setiap pelajaran WebAssembly (WASM) for High Performance Apps menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengirimkan Struktur Data Kompleks
  2. Model & Pengelolaan Memori WASM
  3. Memori Bersama & Operasi Atomik
  4. Mengembangkan dan Mengelola Memori Linear
← Kembali ke WebAssembly (WASM) for High Performance Apps