V8与繁忙的脚本通信

时间:2014-04-02 20:39:35

标签: javascript v8

通过v8,我正在运行等待来自引擎端的输入的javascript。请参见下面的简化示例。问题是Run()是阻塞的,并且标志永远不会设置为0.我还尝试在新线程中执行Run(),结果是访问冲突错误。

是否有一种与正在运行的Javascript代码进行通信的简单方法?如果它需要一个单独的线程,我还缺少什么?

非常感谢您的帮助!

int flag = 1;

static void getFlag(v8::Local<v8::String> property, 
    const v8::PropertyCallbackInfo<v8::Value>& info) {

    info.GetReturnValue().Set(flag);
}

...
objtemplate->SetAccessor(String::NewFromUtf8(isolate, "flag"), getFlag);
...
Handle<String> source = String::NewFromUtf8(isolate, "while(flag) { ... }");
Handle<Script> script = Script::Compile(source);
script->Run();

flag = 0;

这是我的多线程方法:

void runner(v8::Handle<v8::Script> * script) {
    (*script)->Run();
}

CreateThread(0, 0, (LPTHREAD_START_ROUTINE) runner, (LPVOID) &script, 0, 0);

1 个答案:

答案 0 :(得分:0)

没有详细说明上述原因无效的原因:您要实现的是JavaScript中的多线程。那不存在。 JavaScript是一种单线程语言。并发是异步的。和所有其他JS VM一样,V8是一个单线程引擎。多线程可以访问同一个隔离区的唯一方法是通过全局mutax(参见Locker类)。

简而言之,尝试使用基于多线程的编程方法来处理JavaScript将无法让您随处可见。这不是它的工作原理。