Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在node.js中编写线程安全代码_Javascript_Multithreading_Node.js - Fatal编程技术网

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

Javascript 如何在node.js中编写线程安全代码,javascript,multithreading,node.js,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("c

以下是我的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是事件驱动的,下面的场景可能吗

  • 连接为[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中:连接.拼接(1,1);=>连接是[b]
  • 正如您在本场景中看到的,threadC的连接将被删除,而不是threadB的连接


    这会发生吗?如果是,那么我应该如何修复代码?

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


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

    Node.js应用程序中只有一个线程,因此所有Node.js代码都是线程安全的。@JohnnyHK如果是这样,那么我会接受这个答案。这是未来可能改变的事情吗?另外,向运行nodejs的Web服务器添加更多的内核也没有任何帮助?如果您想利用更多的内核/处理器,可以手动使用或使用类似内置的内核。这并不意味着Node.js会消除竞争条件。单个JS线程所做的就是确保JS始终处于关键部分。@Davidermann确实如此。这意味着任何Node.js代码都将运行到完成,不会有任何中断的机会。调用异步方法时仍然可能出现竞争条件,但这是另一个问题。