在Node.js API中避免竞态条件的一个解决方法是使用锁或互斥体来同步对共享资源的访问。以下是一个使用锁来解决竞态条件的示例代码:
const { Worker, isMainThread } = require('worker_threads');
const { Mutex } = require('async-mutex');
// 创建互斥体
const mutex = new Mutex();
if (isMainThread) {
// 主线程
// 共享资源
let sharedData = 0;
// 创建并启动两个工作线程
new Worker(__filename);
new Worker(__filename);
// 模拟对共享资源的并发访问
setInterval(() => {
mutex.runExclusive(async () => {
// 使用互斥体锁定共享资源
sharedData++;
// 模拟其他计算任务
await new Promise(resolve => setTimeout(resolve, 1000));
// 释放互斥体,允许其他线程访问共享资源
});
}, 500);
} else {
// 工作线程
setInterval(() => {
mutex.runExclusive(async () => {
// 使用互斥体锁定共享资源
console.log('Shared data:', sharedData);
// 模拟其他计算任务
await new Promise(resolve => setTimeout(resolve, 1000));
// 释放互斥体,允许其他线程访问共享资源
});
}, 500);
}
在上述示例中,我们使用async-mutex
库创建了一个互斥体,并在主线程和两个工作线程中共享它。互斥体的runExclusive
方法用于锁定共享资源,以确保在任何时候只有一个线程可以访问它。这样,即使多个线程并发地尝试访问共享资源,也能保证数据的一致性。