WebAssembly Threads(고급 WebAssembly)는 SharedArrayBuffer와 Atomics API를 활용해 WebAssembly에서 멀티스레드 병렬 처리를 가능하게 하는 확장이다. C/C++, Rust의 멀티스레드 코드를 웹으로 이식할 수 있다.
WebAssembly Threads 구성요소
| 구성 | 설명 |
|---|
| SharedArrayBuffer | 공유 메모리 (wasm 선형 메모리를 스레드간 공유) |
| Atomics | 원자적 연산 (compareExchange, wait, notify) |
| Worker + Wasm | Worker 스레드에서 동일 모듈 실행 |
| POSIX Threads | Emscripten pthreads 지원 |
Rust로 WebAssembly Threads 사용
rust
// src/lib.rs
use wasm_bindgen::prelude::*;
use rayon::prelude::*;
# [wasm_bindgen]
pub fn parallel_sum(data: &[f64]) -> f64 {
// Rayon이 WebAssembly Threads로 병렬화
data.par_iter().sum()
}
toml
# Cargo.toml
[dependencies]
wasm-bindgen = "0.2"
rayon = "1.8"
bash
# 빌드
wasm-pack build --target web -- --features parallel
JavaScript에서 SharedArrayBuffer 사용
javascript
// HTTP 헤더 필요: Cross-Origin-Opener-Policy: same-origin
// Cross-Origin-Embedder-Policy: require-corp
const memory = new WebAssembly.Memory({
initial: 256,
maximum: 4096,
shared: true // SharedArrayBuffer 사용
});
// Worker에게 공유 메모리 전달
const worker = new Worker('worker.js');
worker.postMessage({ memory }, []); // 전송이 아닌 공유!
// 원자적 연산
const sharedArray = new Int32Array(memory.buffer);
Atomics.store(sharedArray, 0, 42);
Atomics.wait(sharedArray, 0, 42); // 값이 변경될 때까지 대기
활용 사례
- •이미지/비디오 처리: FFmpeg WebAssembly (멀티스레드)
- •물리 시뮬레이션: Bullet Physics, Box2D
- •ML 추론: ONNX Runtime WebAssembly
- •암호화: libsodium, OpenSSL 포팅
관련 개념