Безопасность глобальных переменных при использовании i ++ в Node.js - PullRequest
3 голосов
/ 14 июля 2020
var i = 1;

function er() {
   i++;
}

Насколько мне известно, операция i++ состоит из трех шагов. Чтение-изменение-запись, когда какое-либо событие выполняет чтение (на первом этапе), может ли любое другое изменить то же значение i? Может ли какое-либо другое событие после прочтения во время модификации получить доступ на изменение путем переключения контекста? Как работает переключение контекстов?

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Javascript (nodejs) по своей сути однопоточный. Все происходит в обратном вызове, разрешении обещаний, обработчике таймера / интервала или в основной программе. Эти вещи не могут быть замещены, как в многопоточной среде.

В Javascript переключение контекста или переключение потоков не может вызвать потенциальное состояние гонки, нарушающее целостность i++ или любая другая операция чтения-изменения-записи.

Язык не требует аппаратной операции с блокировкой инкремента, предоставляемой, например, C# методом Interlocked.Increment() .

0 голосов
/ 14 июля 2020

Как уже говорили другие, node.js является однопоточным, поэтому в этом примере нет риска состояния гонки из-за переключения контекста. Чтобы ответить на ваш вопрос о переключении контекста, переключение контекста происходит, когда планировщик решает переключить потоки. Допустим, у вас есть два потока, i ++ и i--, и значение i равно 10. Первый поток может выполнить загрузку и изменить i, но затем может закончиться назначенное ему время ЦП. Контекст будет сохранен, и второй поток может выполнить свои 3 шага. Теперь в памяти значение i уменьшено до 9. Теперь первый поток возобновляет загрузку своего значения i из контекста и выполняет свой последний шаг - запись в память. Теперь значение i в памяти равно 11. В зависимости от порядка, в котором запланированы потоки, значение i в памяти может оказаться равным 9, 10 или 11. Это состояние гонки, ситуация, в которой общий ресурс изменяется двумя или более процессами или потоками, и результат зависит от порядка выполнения. Вы можете провести небольшое исследование параллельного программирования, если хотите узнать больше!

...