- Create a one-element int32 SharedArrayBuffer for the lock to use
- Share that SharedArrayBuffer via workerData with your nodejs worker threads
- Create atomic-lock instances with that SharedArrayBuffer in each worker thread
- Lock your critical section
- Unlock when finished
const { Worker, workerData } = require("worker_threads")
const numThreads = 8
const sab = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT))
const result = new Int32Array(
new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT)
)
let doneCount = 0
for (let i = 0; i < numThreads; i++) {
const worker = new Worker(
`
const { workerData } = require('worker_threads')
const { sab, result } = workerData
const Lock = require('atomic-lock')
const lock = new Lock(sab)
for(let i = 0; i < 1_000_000; i++) {
lock.lock()
result[0] += 1
lock.unlock()
}
`,
{ eval: true, workerData: { sab, result } }
)
worker.on("exit", (code) => {
doneCount++
if (doneCount === numThreads) {
console.log(result) // 8,000,000
}
})
}