От издательства....10
Вступительное слово....11
Предисловие....13
Об авторах....17
Об иллюстрации на обложке....18
Глава 1. Введение....19
Что такое потоки?....21
Конкурентность и параллелизм....22
Однопоточный JavaScript....24
Скрытые потоки....26
Потоки на C: обогатитесь с помощью криптовалюты Happycoin....28
С одним главным потоком....28
С четырьмя рабочими потоками....31
Глава 2. Браузеры....35
Выделенные исполнители....35
Выделенный исполнитель Hello World....36
Продвинутое использование выделенного исполнителя....39
Разделяемые исполнители....40
Разделяемый исполнитель Hello World....42
Продвинутое использование разделяемого исполнителя....46
Сервисные исполнители....48
Сервисный исполнитель Hello World....49
Продвинутые возможности сервисных исполнителей....54
Абстракции передачи сообщений....56
Паттерн RPC....57
Паттерн Диспетчер команд....58
Соберем все вместе....60
Глава 3. Node.js....66
Что было до потоков....67
Модуль worker_threads....69
workerData....70
MessagePort....70
И снова Happycoin....72
С одним главным потоком....73
С четырьмя потоками....75
Piscina – организация пула рабочих потоков....76
Полный пул Happycoin’ов....80
Глава 4. Разделяемая память....83
Введение в разделяемую память....83
Разделяемая память в браузере....84
Разделяемая память в Node.js....86
SharedArrayBuffer и типизированные массивы....88
Атомарные методы манипулирования данными....93
Atomics.add()....93
Atomics.and()....94
Atomics.compareExchange()....94
Atomics.exchange()....94
Atomics.isLockFree()....94
Atomics.load()....95
Atomics.or()....95
Atomics.store()....95
Atomics.sub()....95
Atomics.xor()....96
Несколько замечаний об атомарности....96
Сериализация данных....99
Булевы значения....99
Строки....100
Объекты....102
Глава 5. Дополнительные способы работы с разделяемой памятью....103
Атомарные методы координации....103
Atomics.wait()....104
Atomics.notify()....105
Atomics.waitAsync()....106
Хронометраж и недетерминированность....106
Пример недетерминированности....106
Определение готовности потока....109
Пример приложения: игра «Жизнь» Конвея....111
Однопоточная игра «Жизнь»....112
Многопоточная игра «Жизнь»....115
Атомарные операции и события....122
Глава 6. Паттерны многопоточного программирования....124
Пул потоков....124
Размер пула....125
Стратегии диспетчеризации....126
Пример реализации....128
Мьютекс: простая блокировка....133
Потоковая обработка данных с помощью кольцевых буферов....138
Модель акторов....145
Нюансы паттерна....145
Акторы в JavaScript....146
Пример реализации....147
Глава 7. WebAssembly....154
Ваша первая WebAssembly....154
Атомарные операции в WebAssembly....156
Компиляция с C на WebAssembly с помощью Emscripten....157
Другие компиляторы на WebAssembly....159
AssemblyScript....160
Happycoin на AssemblyScript....161
Глава 8. Анализ....166
Когда не стоит использовать потоки....166
Ограничения на объем памяти....167
Недостаточное число ядер....169
Контейнеры и потоки....172
Когда стоит использовать потоки....172
Подводные камни....177
Приложение. Алгоритм структурированного клонирования....179
Предметный указатель....182
Цель данной книги - научить читателя нескольким аспектам написания многопоточных JavaScript-приложений. Прочитав книгу до конца, вы будете понимать различные API веб-исполнителей в браузерах, их сильные и слабые стороны и когда какой использовать. Также узнаете о модуле рабочих потоков в Node.js и сможете сравнить его API с тем, что имеется в браузере.
Издание предназначено в первую очередь разработчикам, уже знакомым с JavaScript, но мало знакомым с многопоточным программированием.