如何在node.js中编写线程安全代码

时间:2014-07-16 14:49:40

标签: javascript multithreading node.js

这是我的app.js的一部分:

var connections = [];

function removeConnection(res) {
    var i = connections.indexOf(res);
    if (i !== -1) {
        connections.splice(i, 1);
    }
}

我在请求关闭时调用removeConnection:

req.on('close', function () {
    console.log("connection closed");
    removeConnection(res);
});

我想知道上面的代码是否是线程安全的?我的意思是Node.js是事件驱动的,下面的场景可能吗?

  1. 连接是[a,b,c]
  2. threadB调用removeConnection
  3. 在threadB.removeConnection中:i = 1
  4. threadA调用removeConnection
  5. 在threadA.removeConnection中:i = 0
  6. 在threadA.removeConnection中:connections.splice(0,1); =>连接是[b,c]
  7. 在threadA.removeConnection中:connections.splice(1,1); =>连接是[b]
  8. 正如您在此场景中看到的那样,将删除threadC的连接而不是threadB的连接。

    这可能发生吗?如果是,那我该如何修复代码?

1 个答案:

答案 0 :(得分:5)

Node.js的一个关键原则是所有用户代码都在一个线程中运行,这使开发人员无需处理编写线程安全代码的复杂性。

因此,您的代码(以及所有Node.js代码)根据定义是线程安全的。