Mengapa V8 tidak berjalan dengan utas SDL?

9

saya bisa mengkompilasi dan menautkan V8 dengan permainan saya dan interpretasi kode berfungsi dengan baik. Namun saya ingin membagi kode saya dan loop game harus ada di satu utas dan mesin scripting harus berjalan di utas kedua di samping loop permainan saya. Saya menggunakan SDL dan karenanya mencoba kode ini untuk menelurkan utas baru

SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);

di mana kode berikut adalah mesin skrip pengujian saya:

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

Namun saya mendapatkan error seperti Access violation reading location 0x00000000.di api.ccbaris 716: i::Isolate* isolate = env->GetIsolate();.

Adakah yang tahu bagaimana saya bisa memperbaiki ini atau apa masalah sebenarnya?

Christian Ivicevic
sumber
+1 untuk kembali dengan jawabannya. Anda harus benar-benar menjawab pertanyaan Anda sendiri sehingga Anda dapat menandainya sebagai jawaban (tim S / O mendorong untuk menjawab pertanyaan Anda sendiri jika Anda bisa).
Jonathan Dickinson
@ JonathanDickinson: Saya tidak memiliki reputasi yang cukup dan oleh karena itu saya diblokir selama 8 jam sampai saya dapat menjawab pertanyaan saya sendiri. Saya akan melakukan ini besok ;-)
Christian Ivicevic

Jawaban:

6

Larutan

Solusinya adalah menggunakan monitor seperti v8::Locker locker;. Tepatnya baris ini harus dimasukkan baris sebelum pembuatan HandleScopedan itu harus berfungsi, meskipun kode saya di sana adalah omong kosong. Saya telah menggabungkan semua variabel dll menjadi satu metode tanpa setupmetode atau variabel dalam ScriptingEngine.

Singkat cerita: Lockerobjek bertanggung jawab atas manajemen utas karena mesin mengisolasi dirinya untuk keperluan sandboxing.

Christian Ivicevic
sumber
Terkadang hal SO rep ini konyol untuk pengguna yang layak :).
Jonathan Dickinson