目錄
序 1
前言 3
目錄
第1 章 概述 9
1.1 什么是線程 11
1.2 并發(fā)性和并行性 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 數(shù)據操作的原子方法 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 數(shù)據序列化 116
4.5.1 布爾值 116
4.5.2 字符串 118
4.5.3 對象 . 120
第5 章 高級共享內存 121
5.1 原子協(xié)調方法 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 用環(huán)形緩沖器處理數(shù)據流 . 167
6.4 演員模型. 176
6.4.1 模式差異 177
6.4.2 與JavaScript 的關聯(lián) 178
6.4.3 示例實現(xiàn) 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 低核心數(shù) 209
8.1.3 容器與線程 . 213
8.2 何時使用. 213
8.3 注意事項. 219
附錄 結構化克隆算法 223