【问题标题】:Can't tell if this is a race condition无法判断这是否是竞争条件
【发布时间】:2016-04-08 03:31:47
【问题描述】:

我正在尝试使用 nodejs 构建一个简单的聊天服务器(练习)。我有一个全局变量 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 加入聊天室 fender: - chatRoom 看起来像 {fender:['A']} 用户 B 加入聊天室 fender: - chatRoom 看起来像 {fender:['A', 'B']}

用户 B 和 A 想要离开房间,同时这样做: 用户 B indexOfUser === 1; 用户 A indexOfUser === 0; 用户 A 在用户 B 之前拼接了 chatRooms gobal var。 全局 ChatRoom 变量现在看起来像 (fender:['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);

【问题讨论】:

    标签: node.js sockets asynchronous


    【解决方案1】:

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

    【讨论】:

    • 我想我明白了,所以如果请求 1 当前在函数 leaveRoom() 中,同时又有几个离开聊天室的请求同时进来,那么这些新的只有在请求 1 完成后才会处理请求?
    • @DaverMuzaffar 是的,完全正确。在请求 1 完成之前,他们将排队等待轮到他们。
    猜你喜欢
    • 2020-08-25
    • 2011-04-03
    • 1970-01-01
    • 2011-09-16
    • 2011-10-02
    • 1970-01-01
    • 2018-11-25
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多