Нужны ли в 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 может так легко использовать обратные вызовы и блокирует объекты в доступе доступа к явным свойствам почти как необходимо. Тем не менее, я был бы удивлен, если бы встраивание, разработанное для общего кода (например, игровой скриптинг), использующее многопоточность, также не содержало некоторых явных фиксирующих примитивов.
Извините за стену текста!