V8 neden SDL iş parçacıkları ile çalışmıyor?


9

Ben oyun ve kod yorumlama çalışmaları karşı V8 derlemek ve bağlantı başardı. Ancak kodumu bölmek istiyorum ve oyun döngü bir iş parçacığında var olmalı ve komut dosyası motoru benim oyun döngüsünün yanında ikinci bir iş parçacığında çalışmalıdır. SDL kullanıyorum ve bu nedenle yeni bir iş parçacığı oluşturmak için bu kodu denedim

SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);

Aşağıdaki kod benim test komut dosyası motorum:

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

Ancak böyle bir hata alıyorum Access violation reading location 0x00000000.içinde api.cchat 716: i::Isolate* isolate = env->GetIsolate();.

Bunu nasıl düzeltebileceğim veya kesin sorunun ne olduğu hakkında bir ipucu var mı?


Cevapla geri döndüğünüz için +1. Sorunuzu cevaplanmış olarak işaretleyebilmek için kendi sorunuzu gerçekten cevaplamalısınız (S / O ekibi mümkünse kendi sorularınızı yanıtlamayı teşvik eder).
Jonathan Dickinson

@JonathanDickinson: Yeteri kadar itibarım yok ve bu nedenle kendi sorumu yanıtlayabilene kadar 8 saat boyunca bloke oldum. Bunu yarın yapacağım ;-)
Christian Ivicevic

Yanıtlar:


6

Çözüm

Çözüm, benzer bir monitör kullanmaktı v8::Locker locker;. Tam olarak bu satır oluşturulmadan önce satır girilmelidir HandleScopeve çalışmalıdır, ancak benim kodum bok olsa da. Ben bir setupyöntem veya değişkenler olmadan tüm değişkenler vb tek bir yöntemde birleştirdim ScriptingEngine.

Uzun lafın kısası: Lockermotor kendini kumlama amaçları için izole ettiği için nesne iplik yönetiminden sorumludur.


Bazen bu SO rep şey iyi kullanıcılar için saçma :).
Jonathan Dickinson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.