Почему 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 рекомендует отвечать на ваши вопросы, если вы можете).
Джонатан Дикинсон
@JonathanDickinson: У меня недостаточно репутации, и поэтому я заблокирован на 8 часов, пока не смогу ответить на свой вопрос. Я сделаю это завтра ;-)
Кристиан Ивицевич

Ответы:

6

Решение

Решение было использовать монитор, как v8::Locker locker;. Именно эта строка должна быть введена в строку перед созданием, HandleScopeи она должна работать, хотя мой код там дерьмо. Я объединил все переменные и т. Д. В один метод без setupметода или переменных в ScriptingEngine.

Короче говоря: Lockerобъект отвечает за управление потоками, так как движок изолируется для целей песочницы.

Кристиан Ивицевич
источник
Иногда это так глупо для порядочных пользователей :).
Джонатан Дикинсон