문제

이 링크: 구현 상호 배제에서 JavaScript.다른 한편으로,저는 읽기 쓰레드가 사용되어야만 할 이유가 없에서 자바스크립트,하지만 정확히 무슨 뜻입니까?

이벤트가 발생하는 코드에서 그들은 인터럽트?

고 없는 경우에는 스레드에서 JS,필요합니까 사용하는 뮤텍스에서 JS 또는지?

특히,나는에 대해 궁금을 사용하는 효과에 의해 호출 기능 setTimeout()XmlHttpRequestko onreadystatechange 에서 세계적으로 접근하는 변수.

도움이 되었습니까?

해결책

JavaScript는 a로 정의됩니다 요각 언어는 사용자에게 노출 된 스레드가 없다는 것을 의미합니다. 구현에 스레드가있을 수 있습니다. 기능과 같은 기능 setTimeout() 비동기 콜백은 스크립트 엔진이 실행되기 전에 잠을 자기까지 기다려야합니다.

즉, 이벤트에서 발생하는 모든 것이 다음 이벤트가 처리되기 전에 완료해야합니다.

즉, 코드가 비동기 이벤트가 발사되었을 때와 콜백이 호출 될 때 사이에 값이 변경되지 않을 것으로 예상되는 곳을 수행하는 경우 뮤트가 필요할 수 있습니다.

예를 들어, 하나의 버튼을 클릭하는 데이터 구조가 있고 콜백을 호출하는 XMLHTTPREQUEST를 보내면 데이터 구조를 파괴적인 방식으로 변경하고 이벤트가있을 때 사이에 동일한 데이터 구조를 직접 변경하는 다른 버튼이 있습니다. 콜백이 실행되면 콜백 전에 데이터 구조를 클릭하고 업데이트 한 다음 값을 잃을 수 있습니다.

레이스 조건을 만들 수 있지만 각 기능은 원자가되므로 코드에서이를 방지하기가 매우 쉽습니다. 실제로 인종 조건을 만들기 위해 많은 작업이 될 것이며 이상한 코딩 패턴이 필요합니다.

다른 팁

이 질문에 대한 답변은 주어진 당시에는 정확하지만 약간 구식입니다. 웹 워크를 사용하지 않는 클라이언트 측 JavaScript 응용 프로그램을 보면 여전히 정확합니다.

웹 작업자에 관한 기사 :
웹 워즈를 사용하여 JavaScript의 멀티 스레딩
웹 워크 사람들의 모질라

이것은 웹 작업자를 통한 JavaScript에 멀티 스레딩 기능이 있음을 분명히 보여줍니다. 질문에 대해 JavaScript에 뮤텍스가 필요합니까? 나는 이것에 대해 확신이 없다. 그러나이 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에서 상호 배제를 어떻게 처리하는지에 관심이있을 것입니다.

JavaScript는 단일 스레드입니다 ... Chrome은 새로운 짐승 일 수 있지만 (나는 또한 단일 스레드라고 생각하지만 각 탭에는 자체 자바 스크립트 스레드가 있습니다 ... 나는 그것을 자세히 살펴 보지 않았으므로 나를 인용하지 마십시오. 거기).

그러나 걱정해야 할 한 가지는 JavaScript가 귀하가 보내는 것과 동일한 순서가 아닌 여러 Ajax 요청을 처리하는 방법입니다. 따라서, 당신이 정말로 걱정해야 할 것은 결과가 당신이 보낸 것과 다른 순서로 돌아 오면 서로의 발을 밟지 않는 방식으로 Ajax 호출을 처리하는 것입니다.

이것은 타임 아웃도 마찬가지입니다 ...

JavaScript가 멀티 스레딩이 커지면 Mutxes 등에 대해 걱정할 수 있습니다 ....

예, 탭/Windows간에 공유되는 리소스에 액세스 할 때는 JavaScript에서 MUTEXE가 필요할 수 있습니다. 현지 스토리지.

예를 들어, 사용자가 두 개의 탭을 열면 다음과 같은 간단한 코드가 안전하지 않습니다.

function appendToList(item) {
    var list = localStorage["myKey"];
    if (list) {
        list += "," + item;
    }
    else {
        list = item;
    }
    localStorage["myKey"] = list;
}

LocalStorage 항목이 'got'과 'set'인 시간 사이에 다른 탭이 값을 수정했을 수 있습니다. 일반적으로 가능하지는 않지만 가능합니다. 특정 상황에서 경합과 관련된 가능성과 위험을 스스로 판단해야합니다.

자세한 내용은 다음 기사를 참조하십시오.

이벤트는 신호이지만,자바스크립트 실행은 여전히 하나의 스레드.

나의 이해는 경우 이벤트가 신호 엔진 정지 그것이 무엇인지에 실행되는 순간을 실행하는 이벤트 처리기입니다.후에 핸들러가 완료되면,스크립트 실행을 다시 시작됩니다.이벤트 처리기의 일부를 변경을 공유 변수를 다시 시작 코드가 이러한 변경 내용이 표시 나타나는"갑".

하려는 경우"보호"공유된 데이터는 간단한 boolean flag 충분해야 합니다.

JavaScript, The 언어, 원하는만큼 멀티 스레드가 될 수 있지만 JavaScript 엔진의 브라우저 임베드는 하나의 콜백 만 실행합니다 (Onload, OnFocus, u003Cscript>, 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().

JS의 다른 임베딩을 사용하고 있고 한 번에 여러 스레드를 실행하는 경우 조금 더 Disy를 얻을 수 있지만 JS가 콜백을 너무 쉽게 사용하고 속성 액세스의 객체를 잠그는 방식으로 인해 명시 적 잠금이 거의 필요하지 않습니다. . 그러나 멀티 스레딩을 사용한 일반 코드 (예 : 게임 스크립팅)를 위해 설계된 임베딩도 명백한 잠금 프리미티브를 제공하지 않았다면 놀랄 것입니다.

텍스트의 벽에 대해 죄송합니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top