Dlaczego wersja V8 nie działa z wątkami SDL?

9

udało mi się skompilować i połączyć V8 z moją grą, a interpretacja kodu działa dobrze. Jednak chcę podzielić mój kod, a pętla gry powinna istnieć w jednym wątku, a silnik skryptowy powinien działać w drugim wątku obok mojej pętli gry. Korzystam z SDL i dlatego wypróbowałem ten kod, aby spawnować nowy wątek

SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);

gdzie następujący kod to mój testowy silnik skryptowy:

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;
    }
}

Jednakże pojawia się błąd jak Access violation reading location 0x00000000.w api.ccwierszu 716: i::Isolate* isolate = env->GetIsolate();.

Czy ktoś ma pojęcie, jak to naprawić lub jaki jest dokładny problem?

Christian Ivicevic
źródło
+1 za powrót z odpowiedzią. Naprawdę powinieneś odpowiedzieć na swoje pytanie, aby oznaczyć je jako udzielone (zespół S / O zachęca do odpowiedzi na własne pytania, jeśli możesz).
Jonathan Dickinson
@JathanathanDickinson: Nie mam wystarczającej reputacji i dlatego jestem zablokowany na 8 godzin, dopóki nie będę w stanie odpowiedzieć na własne pytanie. Zrobię to jutro ;-)
Christian Ivicevic

Odpowiedzi:

6

Rozwiązanie

Rozwiązaniem było użycie podobnego monitora v8::Locker locker;. Dokładnie ta linia musi zostać wprowadzona do linii przed utworzeniem HandleScopei powinna działać, chociaż mój kod tam jest badziewiem. Połączyłem wszystkie zmienne itp. W jedną metodę bez setupmetody lub zmiennych w ScriptingEngine.

Krótko mówiąc: Lockerobiekt jest odpowiedzialny za zarządzanie wątkami, ponieważ silnik izoluje się do celów piaskownicy.

Christian Ivicevic
źródło
Czasami ta rzecz SO rep jest głupia dla porządnych użytkowników :).
Jonathan Dickinson