2011-11-27 4 views
2

예 자바 스크립트에서 공식적인 메모리 모델을 요구하는 것은 희망이 없으므로 "모든 브라우저는이 규칙을 따르십시오"라고 생각합니다.자바 스크립트 메모리 모델

내 문제는 다음이다 : 나는 서버에 정의 된 간격으로 이벤트를 전송해야하지만, 그렇게하는 동안 이벤트 내 배열에 추가 할 수 있습니다 예 : 명백한 경쟁 조건에서 거기

function storeEvent(event) { 
    // may be called at any time 
    storedEvents.push(event); 
} 

function broadcastEvents() { 
    if (storedEvents.length !== 0) { 
     var eventString = JSON.stringify(storedEvents); 
     storedEvents = []; 
     // send eventString to server 
    } 
    window.setTimeout(broadcastEvents, BROADCAST_TIMER); 
} 

거기에는 기억 장벽이 없다고 생각조차하지 않습니다.

무엇을 할까? 여기에 자바 메모리 모델이 정말 없습니다.

+1

javascript의 기능에 대한 간략한 설명은 [이 게시물] (http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649)을 참조하십시오. 이벤트 대기열이 작동하며 왜 이것이 경쟁 조건이 아닌지를 나타냅니다. – jfriend00

+0

@ jfriend00 감사합니다. 그래서 기본적으로 재진입없이 구현을 펌핑하는 일반적인 메시지입니다. "그것이 하나의 스레드"와는 별개로 중요하지 않더라도 알 수 있습니다. :) – Voo

+0

예, 설명하는 좋은 방법입니다. – jfriend00

답변

4

경쟁 조건이 없습니다.

브라우저의 모든 JavaScript 코드는 단일 스레드입니다.

setTimeout 콜백은 UI 스레드에서 실행되며 다른 작업을 수행하지 않습니다.

+0

그래서 모든 사용자 이벤트, setTimeouts(), 혜성 서버로부터의 브로드 캐스트는 모두 하나의 스레드가 처리하는 메시지 큐에 푸시됩니까? 가장 효율적인 것은 아니지만 충분히 단순하다고 가정합니다. 그 어딘가에서 읽을 수 있을까요? – Voo

+0

@Voo : 수정하십시오. HTML5 웹 작업자는 백그라운드 스레드를 사용할 수 있습니다. 무엇에 대해 읽어 보시겠습니까? – SLaks

+0

전에 약간의 주위를 둘러 보았습니다. 전체 ECMA 사양은 어디서나 "스레드"를 언급하지 않았습니다. 그래서 저는 브라우저에서 "실제 구현"에 대한 몇 가지 정보를 알고 있는지 궁금합니다. 단지 호기심과 초에 불과합니다. 언뜻 보면 존재하지 않을 것이다. 웹 작업자의 MDN 문서를 살펴 보았습니다. 흥미 롭습니다, 감사합니다 (메시지 구문 분석을 통해 전체 공유 메모리 혼란을 피하는 것이 가장 좋은 해결책입니다). – Voo

관련 문제