---
title: "关于多线程问题"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/webgl-multithreading-issues/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/05-游戏图形与运行时/WebGL/关于多线程问题.md"
content_hash: 62f99d59bc33b96be450488c23d1fc46c229b6c3a6276dd24d27eaa6890f9bc1
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 关于多线程问题

﻿# 关于多线程问题


| 场景          | WebGL 渲染线程                                                                       | C++/WASM 多线程                                                                                            | 说明                                                                       |
| ----------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| 桌面／移动浏览器    | **支持**：使用 `Web Worker + OffscreenCanvas` 渲染线程、`SharedArrayBuffer` & WASM Threads | **支持**：`emcc -s USE_PTHREADS=1 …` 生成 pthreads-WASM，浏览器把每个 `std::thread` 映射到 Worker                      | 需启用 COOP/COEP 响应头以开放 SharedArrayBuffer([caniuse.com][1], [juejin.cn][2]) |
| 微信小程序       | JS Worker & `wx.createOffscreenCanvas()` 可用，但 **仅 2D / 部分 WebGL**                | **不支持**：运行环境禁用了 SharedArrayBuffer，无法启用 WASM Threads([developer.open-douyin.com][3], [blog.csdn.net][4]) |                                                                          |
| 抖音/飞书/字节小游戏 | `tt.createCanvas()` 第二次返回 OffscreenCanvas，可在 Worker 内绘制 WebGL，但仍是 **单工内存**       | **不支持**：与微信相同，没有跨源隔离 API，可用 JS Worker 分工渲染([developer.open-douyin.com][3])                              |                                                                          |

### 1. 浏览器端：真·多线程 WebGL + WASM

1. **开启浏览器线程能力**

```bash
emcc main.cpp \
	-sUSE_PTHREADS=1           # 打开 pthreads → WASM Threads
	-sPTHREAD_POOL_SIZE=8      # 预建 8 个 Worker
	-sOFFSCREENCANVAS_SUPPORT=1\
	-sPROXY_TO_PTHREAD=1       # 把主线程逻辑也放到 Worker
	-O3 -o index.html
```

2. **服务器需送两头**（缺一不可）

```yaml
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
```

   这样浏览器会解锁 `SharedArrayBuffer`，WASM Threads 就能共享线性内存。

3. **典型线程代码**

```cpp
#include <thread>
void worker(int id){ /* heavy job */ }
int main(){
   std::thread t(worker, 0);
   t.join();
   return 0;
}
```

每条 `std::thread` 会被 Emscripten 映射成一个 JavaScript Worker，渲染可通过 `emscripten_set_canvas_element_size` 或 `eglMakeCurrent` 与 OffscreenCanvas 交互。

---

### 2. 微信 / 抖音小程序：只有「逻辑线程」，没有「共享内存」

微信不支持wasm层面启用多线程。
Worker框架多线程文档： https://developers.weixin.qq.com/minigame/dev/guide/framework/worker/tutorial.html

[1]: https://caniuse.com/wasm-threads?utm_source=chatgpt.com "WebAssembly Threads and Atomics | Can I use... Support tables for HTML5 ..."
[2]: https://juejin.cn/post/7508968054875308043?utm_source=chatgpt.com "Web Worker + OffscreenCanvas，实现真正多线程渲染体验"
[3]: https://developer.open-douyin.com/forum/question/post/66d72de7372f131f6bd89b76 "〖提问〗小游戏中OffscreenCanvas正确的使用姿势应该是怎样？ - 抖音开放平台"
[4]: https://blog.csdn.net/weixin_44892327/article/details/135712532 "微信小程序 页面跳转失败 SharedArrayBuffer will require cross-origin isolation as of M92, around July 2021. See-CSDN博客"
