2016-04-07 33 views
0

我正在嘗試使用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加入聊天室擋泥板: - 聊天室看起來像{擋泥板:「A」]} 用戶B加入聊天室擋泥板: - 聊天室外觀如{fender:['A','B']}

用戶B和A想要離開房間,並且同時這樣做: user B indexOfUser === 1; user A indexOfUser === 0; 用戶A在用戶B之前拼接chatRooms gobal var。 全球聊天室變種現在看起來像(擋泥板:[「B」]} 用戶B indexOfUser不再=== 1 所以當用戶B接頭聊天室都會這樣做使用了錯誤的指標

是這樣的可能,或節點的單線程性質防止這種情況的發生。

什麼是無法弄清楚是如果這兩行代碼將是問題的節點的

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

回答

2

單線程性質阻止了,每滿代碼塊是強烈隔離的,即沒有其他代碼可以以「平行」運行。

+0

我想我知道了,所以如果請求1當前在函數leaveRoom()中,並且同時有幾個請求離開聊天室同時進入,那麼這些新請求只會被提供一旦請求1完成? –

+0

@DaverMuzaffar確實如此。在請求1完成它的工作之前,他們將排隊等待輪到他們。 – freakish

+0

非常感謝,非常感謝 –