目录
序 1
前言 3
目录
第1 章 概述 9
1.1 什么是线程 11
1.2 并发性和并行性 13
1.3 单线程的JavaScript .15
1.4 隐藏的线程 18
1.5 C 语言中的线程:用快乐币致富 . 20
1.5.1 仅用一个主线程 21
1.5.2 使用4 个工作线程 .24
第2 章 浏览器 29
2.1 专用worker .30
2.1.1 专用worker 的Hello World 30
2.1.2 专用worker 的高级用法 .34
2.2 共享worker .36
2.2.1 共享worker 的Hello World 38
2.2.2 共享worker 的高级用法 .44
2.3 service worker .47
2.3.1 service worker 的Hello World 49
2.3.2 service worker 的高级概念 .55
2.4 消息传递的抽象 58
2.4.1 RPC 模式 .58
2.4.2 命令调度器模式 60
2.4.3 混合模式 .62
第3 章 Node.js .71
3.1 在拥有线程之前 72
3.2 worker_threads 模块 75
3.2.1 workerData .76
3.2.2 MessagePort 77
3.3 再次看快乐币(Happycoin)这个程序 .79
3.3.1 单线程版本 80
3.3.2 四个线程的版本 82
3.4 带有Piscina 的worker 池 .85
3.5 一个完整的池化快乐币的例子 90
第4 章 共享内存 95
4.1 共享内存简介 .96
4.1.1 浏览器中的共享内存.96
4.1.2 在Node.js 中的共享内存 . 100
4.2 SharedArrayBuffer 和TypedArrays 102
4.3 数据操作的原子方法 108
4.3.1 Atomics.add() . 109
4.3.2 Atomics.and() . 109
4.3.3 Atomics.compareExchange() 110
4.3.4 Atomics.exchange() . 110
4.3.5 Atomics.isLockFree() . 110
4.3.6 Atomics.load() 111
4.3.7 Atomics.or() 111
4.3.8 Atomics.store() 111
4.3.9 Atomics.sub() . 112
4.3.10 Atomics.xor() 112
4.4 原子性问题 112
4.5 数据序列化 116
4.5.1 布尔值 116
4.5.2 字符串 118
4.5.3 对象 . 120
第5 章 高级共享内存 121
5.1 原子协调方法 121
5.1.1 Atomics.wait() 122
5.1.2 Atomics.notify() 124
5.1.3 Atomics.waitAsync() 124
5.2 时间和不确定性 . 125
5.2.1 不确定性的例子 125
5.2.2 检测线程准备情况 129
5.3 示例应用:康威生命游戏 . 132
5.3.1 单线程生命游戏 133
5.3.2 多线程生命游戏 139
5.4 原子和事件 146
第6 章 多线程模式 149
6.1 线程池 . 149
6.1.1 线程池的大小 . 150
6.1.2 调度策略 152
6.1.3 应用实例 153
6.2 互斥锁:一个基本的锁 161
6.3 用环形缓冲器处理数据流 . 167
6.4 演员模型. 176
6.4.1 模式差异 177
6.4.2 与JavaScript 的关联 178
6.4.3 示例实现 179
第7 章 WebAssembly . 189
7.1 你的第一个WebAssembly .190
7.2 WebAssembly 中的原子操作 192
7.3 用Emscripten 将C 程序编译成WebAssembly 194
7.4 其他WebAssembly 编译器 196
7.5 AssemblyScript 197
7.6 AssemblyScript 中的快乐币 199
第8 章 分析 . 205
8.1 何时不使用 205
8.1.1 低内存限制 . 206
8.1.2 低核心数 209
8.1.3 容器与线程 . 213
8.2 何时使用. 213
8.3 注意事项. 219
附录 结构化克隆算法 223