首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用V8::Function::之前是否需要抓取v8::Locker?

调用V8::Function::之前是否需要抓取v8::Locker?
EN

Stack Overflow用户
提问于 2016-06-26 02:31:38
回答 1查看 1.3K关注 0票数 0

我正在使用V8执行一些自定义的javascript代码,将OnUpdate函数暴露给JS世界。总体而言,代码运行良好,但目前我担心以下代码的性能-执行任何用户定义的函数是否需要获取v8::LockerInstruments.app显示代码在v8::Locker构造函数和析构函数中花费了太多时间-

90ms(在实际代码执行中)与~4000ms (由Locker &~Locker编写)--这很荒谬,我觉得我可能做错了什么。

所以我的基本问题是,执行v8::Function::Call真的需要抓取v8::Locker吗?在当前状态下,如果我注释掉v8::Locker,我会得到以下错误消息:

代码语言:javascript
复制
# Fatal error in HandleScope::HandleScope
# Entering the V8 API without proper locking in place

代码片段:

代码语言:javascript
复制
int Bucket::send_doc_update_bucket(const char *msg) {
    Locker locker(GetIsolate());
    Isolate::Scope isolate_scope(GetIsolate());
    HandleScope handle_scope(GetIsolate());

    Local<Context> context = Local<Context>::New(GetIsolate(), context_);
    Context::Scope context_scope(context);

    TryCatch try_catch;

    Local<Value> args[1];
    args[0] = String::NewFromUtf8(GetIsolate(), msg);

    assert(!try_catch.HasCaught());

    Handle<Value> val;
    if(!context->Global()->Get(context,
                               createUtf8String(GetIsolate(),
                                                "OnUpdate")).ToLocal(&val) ||
      !val->IsFunction()) {
          return 3;
    }

    Handle<Function> on_doc_update = Handle<Function>::Cast(val);
    on_doc_update->Call(context, context->Global(), 1, args);

    if (try_catch.HasCaught()) {
        //w->last_exception = ExceptionString(GetIsolate(), &try_catch);
        return 2;
    }

    return 0;
 }
EN

回答 1

Stack Overflow用户

发布于 2016-09-16 13:16:47

如果你不做任何多线程,你永远不需要接触v8::Locker。不过,一旦你这样做了,你就必须把它放在几乎所有的地方。

一个v8::Locker用于阻止来自同一个v8::Isolate的多个V8::Context同时运行。

如果您希望同时执行多个线程,则必须在不同的隔离中创建每个上下文。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38031703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档