无法判断这是否是竞争条件

时间:2016-04-07 19:23:50

标签: node.js sockets asynchronous

我正在尝试使用nodejs构建一个简单的聊天服务器(练习)。我有一个全局var chatRooms,它可以被服务器的所有请求更改或读取。我想弄清楚我是否可能造成一些竞争条件。我也通过节点网络模块使用套接字。

var net = require('net');
var chatRooms = {fender:[]};

function enterRoom(socket, room){
  charRooms[room].push(socket.username);
}

function leaveRoom(socket, room){
  var indexOfUser = chatRooms[room].indexOf(socket.username);
  chatRoom[room].splice(indexOfUser, 1);
}

所以,我试图弄清楚这种情况: 用户A加入聊天室挡泥板: - chatRoom看起来像{挡泥板:[' A']} 用户B加入聊天室挡泥板: - chatRoom看起来像{挡泥板:[' A',' B']}

用户B和A想要离开房间,同时这样做: 用户B indexOfUser === 1; user A indexOfUser === 0; 用户A在用户B之前拼接chatRooms gobal var。 全局ChatRoom var现在看起来像(挡泥板:[' B']} 用户B indexOfUser不再=== 1 因此,当用户B拼接ChatRooms时,它将使用错误的索引。

这样的事情是可能的,或者节点的单线程性质阻止了这种情况发生。

如果这两行代码存在问题,那么无法解决的问题

var indexOfUser = chatRooms[room].indexOf(socket.username);
// another request alters charRooms before the next line of code is reached.
chatRoom[room].splice(indexOfUser, 1);

1 个答案:

答案 0 :(得分:2)

节点的单线程特性阻止了这一点。每个完整的代码块都是强隔离的,即没有其他代码可以“并行”运行。