簡體   English   中英

在制作v8 :: Function :: Call之前是否需要抓住v8 :: Locker?

[英]Is it required to grab v8::Locker before making v8::Function::Call?

我正在使用V8執行一些自定義的JavaScript代碼,從而將OnUpdate函數暴露給JS world。 總體代碼可以正常工作,但是當前我擔心以下代碼的性能-是否需要抓取v8::Locker才能執行任何用戶定義的功能? Instruments.app顯示此處的代碼在v8::Locker構造函數和析構函數中花費了太多時間-

v8個人資料

90毫秒(實際執行代碼)VS〜4000ms(由Locker~Locker ) -這是荒謬的,我覺得我可能會做一些錯誤。

所以我的基本問題是真的有必要抓住v8::Locker來執行v8::Function::Call嗎? 在當前狀態下,如果我注釋掉v8::Locker則會收到以下錯誤消息:

# Fatal error in HandleScope::HandleScope
# Entering the V8 API without proper locking in place

程式碼片段:

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

如果您不執行任何多線程操作,則無需觸摸v8 :: Locker。 但是,一旦這樣做,就必須到處都有它。

v8 :: Locker用於阻止同一v8 :: Isolate中的多個v8 :: Context同時運行。

如果要同時執行多個線程,則必須在不同的隔離環境中創建每個上下文。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM