V8이 SDL 스레드와 함께 실행되지 않는 이유는 무엇입니까?


9

V8을 컴파일하고 게임에 연결할 수 있었고 코드 해석이 잘 작동합니다. 그러나 코드를 나누고 싶을 때 게임 루프가 하나의 스레드에 존재하고 스크립팅 엔진이 게임 루프와 함께 두 번째 스레드에서 실행되어야합니다. SDL을 사용하고 있으므로이 코드를 사용하여 새 스레드를 생성했습니다.

SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);

다음 코드는 테스트 스크립트 엔진입니다.

namespace ScriptingEngine {
    v8::HandleScope handleScope;
    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
    v8::Persistent<v8::Context> context;

    void Setup() {
            // TODO: bind functions to global
            // ...
            context = v8::Context::New(NULL, global);
    }

    int SpawnMain(void *arguments) {
            v8::Context::Scope scope(context);
            v8::Handle<v8::Script> script = v8::Script::Compile(
                    v8::String::New("'Hello World'")
            );
            v8::Handle<v8::Value> result = script->Run();
            context.Dispose();
            return EXIT_SUCCESS;
    }
}

그러나 나는 같은 오류가 Access violation reading location 0x00000000.있는 api.cc라인 (716) : i::Isolate* isolate = env->GetIsolate();.

누구든지 내가 어떻게 해결할 수 있는지 또는 정확한 문제가 무엇인지 실마리가 있습니까?


답변을 다시 받으면 +1입니다. 자신의 질문에 답변해야 답변을 표시 할 수 있습니다 (S / O 팀은 가능하면 자신의 질문에 답변하도록 권장합니다).
Jonathan Dickinson

@JonathanDickinson : 평판이 충분하지 않아서 본인의 질문에 대답 할 수있을 때까지 8 시간 동안 차단되었습니다. 나는 내일 이것을 할 것이다 ;-)
Christian Ivicevic

답변:


6

해결책

해결책은와 같은 모니터를 사용하는 것이 었습니다 v8::Locker locker;. 정확하게이 줄은 생성하기 전에 줄에 입력해야하며 HandleScope코드가 잘못되었지만 작동해야합니다. 에있는 setup메소드 나 변수 없이 모든 변수 등을 하나의 메소드로 결합 했습니다 ScriptingEngine.

간단히 말해 : Locker엔진은 샌드 박싱 목적으로 자체적으로 분리되므로 스레드 관리를 담당합니다.


때로는이 SO 담당자는 괜찮은 사용자에게는 어리 석습니다 :).
Jonathan Dickinson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.