本書(shū)主要討論了構(gòu)建多線程應(yīng)用的兩種方法:一種是使用消息傳遞,另一種是使用共享內(nèi)存。你將學(xué)習(xí)實(shí)現(xiàn)每種方法的API,包括根據(jù)情況進(jìn)行選擇,以及何時(shí)可以結(jié)合使用它們。你還將親自動(dòng)手實(shí)踐這些方法構(gòu)建的高級(jí)模式。
目錄
序 1
前言 3
目錄
第1 章 概述 9
1.1 什么是線程 11
1.2 并發(fā)性和并行性 13
1.3 單線程的JavaScript .15
1.4 隱藏的線程 18
1.5 C 語(yǔ)言中的線程:用快樂(lè)幣致富 . 20
1.5.1 僅用一個(gè)主線程 21
1.5.2 使用4 個(gè)工作線程 .24
第2 章 瀏覽器 29
2.1 專用worker .30
2.1.1 專用worker 的Hello World 30
2.1.2 專用worker 的高級(jí)用法 .34
2.2 共享worker .36
2.2.1 共享worker 的Hello World 38
2.2.2 共享worker 的高級(jí)用法 .44
2.3 service worker .47
2.3.1 service worker 的Hello World 49
2.3.2 service worker 的高級(jí)概念 .55
2.4 消息傳遞的抽象 58
2.4.1 RPC 模式 .58
2.4.2 命令調(diào)度器模式 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 再次看快樂(lè)幣(Happycoin)這個(gè)程序 .79
3.3.1 單線程版本 80
3.3.2 四個(gè)線程的版本 82
3.4 帶有Piscina 的worker 池 .85
3.5 一個(gè)完整的池化快樂(lè)幣的例子 90
第4 章 共享內(nèi)存 95
4.1 共享內(nèi)存簡(jiǎn)介 .96
4.1.1 瀏覽器中的共享內(nèi)存.96
4.1.2 在Node.js 中的共享內(nèi)存 . 100
4.2 SharedArrayBuffer 和TypedArrays 102
4.3 數(shù)據(jù)操作的原子方法 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 原子性問(wèn)題 112
4.5 數(shù)據(jù)序列化 116
4.5.1 布爾值 116
4.5.2 字符串 118
4.5.3 對(duì)象 . 120
第5 章 高級(jí)共享內(nèi)存 121
5.1 原子協(xié)調(diào)方法 121
5.1.1 Atomics.wait() 122
5.1.2 Atomics.notify() 124
5.1.3 Atomics.waitAsync() 124
5.2 時(shí)間和不確定性 . 125
5.2.1 不確定性的例子 125
5.2.2 檢測(cè)線程準(zhǔn)備情況 129
5.3 示例應(yīng)用:康威生命游戲 . 132
5.3.1 單線程生命游戲 133
5.3.2 多線程生命游戲 139
5.4 原子和事件 146
第6 章 多線程模式 149
6.1 線程池 . 149
6.1.1 線程池的大小 . 150
6.1.2 調(diào)度策略 152
6.1.3 應(yīng)用實(shí)例 153
6.2 互斥鎖:一個(gè)基本的鎖 161
6.3 用環(huán)形緩沖器處理數(shù)據(jù)流 . 167
6.4 演員模型. 176
6.4.1 模式差異 177
6.4.2 與JavaScript 的關(guān)聯(lián) 178
6.4.3 示例實(shí)現(xiàn) 179
第7 章 WebAssembly . 189
7.1 你的第一個(gè)WebAssembly .190
7.2 WebAssembly 中的原子操作 192
7.3 用Emscripten 將C 程序編譯成WebAssembly 194
7.4 其他WebAssembly 編譯器 196
7.5 AssemblyScript 197
7.6 AssemblyScript 中的快樂(lè)幣 199
第8 章 分析 . 205
8.1 何時(shí)不使用 205
8.1.1 低內(nèi)存限制 . 206
8.1.2 低核心數(shù) 209
8.1.3 容器與線程 . 213
8.2 何時(shí)使用. 213
8.3 注意事項(xiàng). 219
附錄 結(jié)構(gòu)化克隆算法 223