자바 스크립트에 뮤텍스가 필요합니까?
나는이 링크를 보았다 : Implementing Mutual Exclusion in JavaScript . 다른 한편으로, 나는 자바 스크립트에 스레드가 없다는 것을 읽었지만 정확히 무엇을 의미합니까?
이벤트가 발생하면 코드에서 인터럽트 할 수있는 곳은 어디입니까?
그리고 JS에 스레드가 없으면 JS에서 뮤텍스를 사용해야합니까?
특히, 전역 적으로 액세스 할 수있는 변수에 대한 setTimeout()및 XmlHttpRequest's onreadystatechange에 의해 호출되는 함수를 사용하는 효과에 대해 궁금 합니다.
자바 스크립트는 재진입 언어로 정의되어 사용자에게 노출되는 스레딩이 없으며 구현에 스레드가있을 수 있습니다. setTimeout()및 비동기 콜백 과 같은 함수 는 스크립트 엔진이 실행되기 전에 휴면 상태가 될 때까지 기다려야합니다.
즉, 이벤트에서 발생하는 모든 작업은 다음 이벤트가 처리되기 전에 완료되어야합니다.
즉, 코드가 비동기 이벤트가 시작된 시점과 콜백이 호출 된 시점 사이에 값이 변경되지 않을 것으로 예상하는 작업을 수행하는 경우 뮤텍스가 필요할 수 있습니다.
예를 들어 버튼 하나를 클릭하고 콜백을 호출하는 XmlHttpRequest를 전송하는 데이터 구조가있는 경우 데이터 구조를 파괴적인 방식으로 변경하고 이벤트가 발생했을 때 동일한 데이터 구조를 직접 변경하는 다른 버튼이있는 경우 호출되고 콜백이 실행되었을 때 사용자는 콜백 전에 데이터 구조를 클릭하고 업데이트하여 값을 잃을 수 있습니다.
이와 같은 경쟁 조건을 만들 수 있지만 각 함수는 원자 적이므로 코드에서이를 방지하는 것은 매우 쉽습니다. 실제로 경쟁 조건을 생성하려면 많은 작업이 필요하고 이상한 코딩 패턴이 필요합니다.
이 질문에 대한 답변은 제공된 당시에는 정확하지만 약간 구식입니다. 웹 워커를 사용하지 않는 클라이언트 측 자바 스크립트 애플리케이션을 보면 여전히 정확합니다.
웹 워커에 대한 기사 : 웹 워커를
사용하는 자바 스크립트에서 멀티 스레딩 웹 워커의
Mozilla
이것은 웹 작업자를 통한 자바 스크립트가 다중 스레딩 기능을 가지고 있음을 분명히 보여줍니다. 질문에 관해서는 자바 스크립트에 뮤텍스가 필요합니까? 잘 모르겠습니다. 그러나이 stackoverflow 게시물은 관련성이있는 것 같습니다.
N 비동기 스레드에 대한 상호 배제
@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는 단일 스레드입니다 ... Chrome이 새로운 짐승 일 수 있지만 (나는 또한 단일 스레드라고 생각하지만 각 탭에는 자체 JavaScript 스레드가 있습니다 ... 자세히 살펴 보지 않았으므로 인용하지 마십시오. 그곳에).
그러나 걱정할 필요가있는 한 가지는 JavaScript가 보내는 것과 동일한 순서가 아닌 여러 개의 ajax 요청을 처리하는 방법입니다. 따라서 당신이 정말로 걱정할 필요가있는 것은 결과가 당신이 보낸 순서와 다른 순서로 돌아올 경우 서로의 발을 밟지 않는 방식으로 당신의 ajax 호출이 처리되는지 확인하는 것입니다.
이것은 시간 초과에도 적용됩니다 ...
JavaScript가 멀티 스레딩을 확장하면 뮤텍스 등에 대해 걱정할 수 있습니다 ....
예, localStorage 와 같이 탭 / 창간에 공유되는 리소스에 액세스 할 때 자바 스크립트에서 뮤텍스가 필요할 수 있습니다 .
예를 들어 사용자에게 두 개의 탭이 열려있는 경우 다음과 같은 간단한 코드는 안전하지 않습니다.
function appendToList(item) {
var list = localStorage["myKey"];
if (list) {
list += "," + item;
}
else {
list = item;
}
localStorage["myKey"] = list;
}
localStorage 항목이 'got'과 'set'이되는 시간 사이에 다른 탭에서 값을 수정했을 수 있습니다. 일반적으로 가능성은 낮지 만 가능합니다. 특정 상황에서 발생하는 경합과 관련된 가능성과 위험을 스스로 판단해야합니다.
자세한 내용은 다음 문서를 참조하십시오.
- 만지지 마세요 : 상호 배제 잠금 및 JavaScript-Medium Engineering
- JavaScript 동시성 및 HTML5 localStorage 잠금-Benjamin Dumke-von der Eh, Stackoverflow
Events are signaled, but JavaScript execution is still single-threaded.
My understanding is that when event is signaled the engine stops what it is executing at the moment to run event handler. After the handler is finished, script execution is resumed. If event handler changed some shared variables then resumed code will see these changes appearing "out of the blue".
If you want to "protect" shared data, simple boolean flag should be sufficient.
JavaScript, the language, can be as multithreaded as you want, but browser embeddings of the javascript engine only runs one callback (onload, onfocus, <script>, etc...) at a time (per tab, presumably). William's suggestion of using a Mutex for changes between registering and receiving a callback should not be taken too literally because of this, as you wouldn't want to block in the intervening callback since the callback that will unlock it will be blocked behind the current callback! (Wow, English sucks for talking about threading.) In this case, you probably want to do something along the lines of redispatching the current event if a flag is set, either literally or with the likes of setTimeout().
If you are using a different embedding of JS, and that executes multiple threads at once, it can get a bit more dicey, but due to the way JS can use callbacks so easily and locks objects on property access explicit locking is not nearly as necessary. However, I would be surprised if an embedding designed for general code (eg, game scripting) that used multi threading didn't also give some explicit locking primitives as well.
Sorry for the wall of text!
참고URL : https://stackoverflow.com/questions/124764/are-mutexes-needed-in-javascript
'Programming' 카테고리의 다른 글
| snprintf 및 Visual Studio 2010 (0) | 2020.08.20 |
|---|---|
| Xcode 7에서 "iTunes 연결 액세스 권한이있는 계정이 없습니다"라는 오류가 계속 나타납니다. (0) | 2020.08.20 |
| 원래 목적 (0) | 2020.08.20 |
| UNIX에서 파일 추가 원자 적입니까? (0) | 2020.08.20 |
| 우분투에서 바람둥이 6을 다시 시작하는 방법 (0) | 2020.08.20 |