我正在爲Node編寫一個簡單的基於消息的管理器/工作者(http://lya.fciencias.unam.mx/jloa/patrones/MW.html)模塊。通常,在多線程環境中,修改數據的代碼需要鎖定以防止其他線程更改數據中間例程,從而導致混淆競爭條件。例如:在管理員/工作模式中使用子進程以確保線程安全時,Node.js中是否需要鎖定?
function assignWork(job) {
if (!this.isWorkComplete && this.workerQueue.length != 0) {
this.workerQueue.pop().runJob(job);
}
}
上面的代碼,在多線程環境中,將需要的鎖,因爲它可能是另一個線程將清空這線程檢查它被填充和時間之間的工作隊列它將工作人員從隊列中彈出,導致錯誤。
但是,我的理解是,因爲Node使用單個事件隊列,所以同步代碼不可能有上述問題,因爲一次只能執行一個線程。
這個假設是否正確?而且,如果Node對於Node來說是正確的,那麼是否存在其他使用多線程的實現,並且需要鎖定機制來確保線程安全?
我的理解是,Node的child_process與[link](https://nodejs.org/api/child_process.html)的工作方式類似:「請記住生成的Node.js子進程非常重要獨立於父節點,除了在兩者之間建立的IPC通信通道之外,每個進程都有自己的內存和自己的V8實例。「然而,我所描述的問題並不涉及子進程在Manager中編輯數據(因爲缺少共享內存,他們不能),而且我需要鎖定的函數是同步的。在這種情況下,它是否是線程安全的? – Will
你在JavaScript中做的任何事情都是線程安全的,但是如果你正在激化多個事件,你可能仍然會遇到競爭條件。所以是的,它是線程安全的。總是。 –