如何在node.js中编写线程安全代码
这是我的app.js的一部分:
var connections = []; function removeConnection(res) { var i = connections.indexOf(res); if (i !== -1) { connections.splice(i, 1); } }
当请求closures时,我调用removeConnection:
req.on('close', function () { console.log("connection closed"); removeConnection(res); });
我不知道上面的代码是否是线程安全的? 我的意思是Node.js是事件驱动的,下面的情况可能吗?
- 连接是[a,b,c]
- threadB调用removeConnection
- 在threadB.removeConnection中:i = 1
- threadA调用removeConnection
- 在threadA.removeConnection中:i = 0
- 在threadA.removeConnection中:connections.splice(0,1); =>连接是[b,c]
- 在threadA.removeConnection:connections.splice(1,1); =>连接是[b]
正如你在这种情况下看到的,threadC的连接将被删除,而不是threadB的。
这可以发生吗? 如果是,那么我应该如何修复代码?
Node.js的关键原理之一是所有的用户代码都运行在一个单独的线程中,这样就不需要开发人员来处理编写线程安全代码的复杂性。
所以你的代码(和所有的Node.js代码)在定义上是线程安全的。