Нужны ли в MATLECT файлы в javascript?

Я видел эту ссылку: Внедрение взаимного исключения в JavaScript. С другой стороны, я прочитал, что в javascript нет нитей, но что именно это означает?

Когда происходят события, где в коде они могут прерывать?

И если в JS нет потоков, мне нужно использовать мьютексы в JS или нет?

В частности, мне интересно, как использовать функции, называемые setTimeout() и XmlHttpRequest onreadystatechange глобально доступными переменными.

Ответ 1

Javascript определяется как язык reentrant, который означает, что нет потока, подверженного действию пользователя, в реализации могут быть потоки. Такие функции, как setTimeout() и асинхронные обратные вызовы, должны ждать, пока движок script засыпает, прежде чем они смогут запустить.

Это означает, что все, что происходит в событии, должно быть закончено до того, как будет обработано следующее событие.

При этом вам может понадобиться мьютекс, если ваш код делает что-то там, где он ожидает, что значение не изменится между тем, когда было запущено асинхронное событие и когда был вызван обратный вызов.

Например, если у вас есть структура данных, в которой вы нажимаете одну кнопку, и она отправляет XmlHttpRequest, которая вызывает обратный вызов, это разрушает структуру данных, и у вас есть другая кнопка, которая напрямую меняет одну и ту же структуру данных, между событие было запущено, и когда был выполнен обратный вызов, пользователь мог нажать и обновить структуру данных до обратного вызова, который затем может потерять значение.

Пока вы можете создать условие гонки, подобное очень легко предотвратить в коде, поскольку каждая функция будет атомарной. Было бы много работы и взять некоторые нечетные шаблоны кодирования, чтобы создать состояние гонки на самом деле.

Ответ 2

Ответы на этот вопрос немного устарели, хотя правильные в то время, когда они были даны. И все же правильно, если смотреть на клиентское приложение javascript, которое НЕ использует веб-мастеров.

Статьи о веб-работниках:
многопоточность в javascript с помощью веб-мастеров
Mozilla на веб-страницах

Это ясно показывает, что javascript через веб-работников имеет многопоточность. Что касается вопроса, нужно ли использовать мьютексы в javascript? Я не уверен в этом. Но это сообщение stackoverflow кажется актуальным:
Взаимное исключение для N асинхронных потоков

Ответ 3

Как указывает @william,

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

Это может быть обобщено дальше - если ваш код делает что-то там, где он ожидает эксклюзивного управления ресурсом, пока асинхронный запрос не будет разрешен, вам может потребоваться мьютекс.

Простым примером является то, что у вас есть кнопка, которая запускает вызов ajax для создания записи на задней панели. Возможно, вам понадобится немного кода, чтобы защитить вас от счастливых пользователей триггеров, щелкнув их и тем самым создав несколько записей. существует ряд подходов к этой проблеме (например, отключить кнопку, включить при успешном выполнении ajax). Вы также можете использовать простой замок:

var save_lock = false;
$('#save_button').click(function(){
    if(!save_lock){
        //lock
        save_lock=true;
        $.ajax({
            success:function()
                //unlock
                save_lock = false;  
            }
        });
    }
}

Я не уверен, что это лучший подход, и мне было бы интересно увидеть, как другие обрабатывают взаимное исключение в javascript, но насколько я знаю, что простой мьютекс и он удобен.

Ответ 4

JavaScript однопоточный... хотя Chrome может быть новым зверьком (я думаю, что он также однопоточный, но на каждой вкладке есть собственный поток JavaScript... Я не изучал его подробно, цитата мне там).

Однако, одна вещь, о которой вам нужно беспокоиться, - это то, как ваш JavaScript будет обрабатывать несколько запросов ajax, возвращаясь в том же порядке, который вы отправляете. Таким образом, все, о чем вам действительно нужно беспокоиться, это убедиться, что ваши аякс-звонки обрабатываются таким образом, что они не будут наступать на ноги друг друга, если результаты вернутся в другом порядке, чем вы их отправили.

Это также относится к тайм-аутам...

Когда JavaScript растет многопоточно, тогда, может быть, беспокоиться о мьютексах и т.д....

Ответ 5

События сигнализируются, но выполнение JavaScript по-прежнему однопоточно.

Я понимаю, что когда событие сигнализируется, двигатель останавливает то, что он выполняет в данный момент, для запуска обработчика событий. После завершения обработчика выполнение script возобновляется. Если обработчик событий изменил некоторые общие переменные, то возобновленный код увидит, что эти изменения отображаются "не в синем".

Если вы хотите "защитить" общие данные, должен быть достаточно простого логического флага.

Ответ 6

JavaScript, язык, может быть таким же многопоточным, как и вы, но встроенные в браузер механизмы javascript запускают только один обратный вызов (onload, onfocus, <script> , и т.д.) за раз (за, предположительно). Из-за этого предложение Уильяма об использовании Mutex для изменений между регистрацией и получением обратного вызова не должно восприниматься буквально из-за этого, так как вы не захотите блокировать промежуточный обратный вызов, так как обратный вызов, который будет разблокирован, будет заблокирован за текущим обратным вызовом! (Ничего себе, английский отстой, говоря о потоковом.) В этом случае вы, вероятно, захотите что-то сделать так же, как и повторное выделение текущего события, если флаг установлен либо буквально, либо с помощью setTimeout().

Если вы используете другое вложение JS и выполняете сразу несколько потоков, это может стать немного более рискованным, но из-за того, что JS может так легко использовать обратные вызовы и блокирует объекты в доступе доступа к явным свойствам почти как необходимо. Тем не менее, я был бы удивлен, если бы встраивание, разработанное для общего кода (например, игровой скриптинг), использующее многопоточность, также не содержало некоторых явных фиксирующих примитивов.

Извините за стену текста!