c++ - 如何在 v8 中创建另一个线程

标签 c++ v8

我想为 v8::Script::Run 设置超时。不幸的是,我对 v8 有一点经验。我明白我需要使用 StartPreemtion + Loker + TerminateException。因此,v8::Script::Run 应该位于单独的线程中。执行时间的计算和控制应该在主线程中进行。如何在 v8 中创建另一个线程?请帮助我了解如何去做。 这是我这样做的代码示例,但线程的功能没有启动。

  v8::Local<v8::Value> V8ExecuteString( v8::Handle<v8::String> source, v8::Handle<v8::String> filename )
  {
     // Compiling script
     // ...
     // End compiling script
     DWORD start_tick = ::GetTickCount();
     v8::Locker::StartPreemption( 1 );
     { 
        v8::Unlocker unlocker;
         boost::thread* th = new boost::thread( [&] () {
           v8::Locker locker;
           v8::HandleScope handle_scope;
           // Running script
           // v8::Script::Run()
           // End running script
        });
     }
    // Calculation and control of the execution time
    v8::Locker locker;
    v8::HandleScope handle_scope;
    while ( true )
    {
      // terminate thread after 10 seconds
      if( ( (::GetTickCount() - start_tick) / 1000 ) > 10 )
        // v8::v8::TerminateException(  )
    }
    v8::Locker::StopPreemption();
  }

最佳答案

根据this V8 bug report , StartPreemption() 当前不可靠。但是,您不需要它来实现脚本执行超时。本程序演示了一种方法:

#include "v8.h"
#include "ppltasks.h"

void main(void)
{
    auto isolate = v8::Isolate::New();
    {
        v8::Locker locker(isolate);
        v8::Isolate::Scope isolateScope(isolate);
        v8::HandleScope handleScope(isolate);
        auto context = v8::Context::New();
        {
            v8::Context::Scope contextScope(context);
            auto script = v8::Script::Compile(v8::String::New("while(true){}"));

            // terminate script in 5 seconds
            Concurrency::create_task([isolate]
            {
                Concurrency::wait(5000);
                v8::V8::TerminateExecution(isolate);
            });

            // run script
            script->Run();
        }
        context.Dispose();
    }
    isolate->Dispose();
}

此处的计时器实现显然不是最理想的,并且特定于 Windows 并发运行时,但这只是一个示例。祝你好运!

关于c++ - 如何在 v8 中创建另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16516100/

相关文章:

c++ - 我是 RUBY 的新手,我需要了解 3 个函数

c++ - string[] 还是 vector<string>?

c++ - 如何打印后缀树中的字符串

c++ - 为什么 V8 的 Hello World 在 Ubuntu 上会导致段错误?

c++ - Boost Type Erasure的实践与发现

c++ - 避免 `delete[]` 接受隐式指针转换?

node.js - Nan 无法使用 v8::Object 字段包装和解包对象

javascript - 嵌入式 Node/javascript 沙箱?

javascript - Javascript 对象中的跨浏览器键查找性能

javascript - 在哪里可以找到 XMLHttpRequest 实现?