在V8中使用TerminateExecution

DeX*_*eX3 1 v8 embedded-v8

我现在正在试验V8.我希望能够在一个线程中运行一些(可能是长时间运行的)javascript,然后能够从另一个线程"优雅地"终止执行.

我写了这个简单的片段来测试Lockers的概念和TerminateExecution的用法:

void breaker( Isolate* isolate, int tid ) {

    getchar();      //wait for keyboard input on stdin

    std::cout << "Breaking V8 execution" << std::endl;

    v8::Locker locker( isolate );       //lock the isolate
    v8::V8::TerminateExecution( tid );  //and terminate it
}

int main( int argc, char **argv ) {

    if( argc != 2 ) {
        std::cout << "No script name given" << std::endl;
        return 1;
    }

    Isolate* isolate = Isolate::New();              //create a new isolate
    Isolate::Scope isolateScope( isolate );         //enter it

    v8::Locker locker( isolate );                   //lock the isolate
    v8::Locker::StartPreemption( 100 );             //and start preemption

    v8::HandleScope handle_scope( isolate );        //open a new handle scope


    /*** inject a console object into the global context ***/
    v8::Handle<v8::ObjectTemplate> globalTemplate = v8::ObjectTemplate::New();

    Handle<Context> context = Context::New( NULL, globalTemplate );
    v8::Context::Scope context_scope( context );

    Console* console = new Console;
    Handle<Object> jsConsole = wrap_console( isolate, console );
    expose_property( jsConsole, String::New( "log" ), InvocationCallback( Console::consoleLog ) );
    context->Global()->Set( String::New( "console" ), jsConsole, v8::ReadOnly );
    /*******************************************************/


    //read a javascript file supplied via console
    std::string contents = read_file( argv[1] );
    v8::Handle<v8::String> js = v8::String::New( contents.c_str() );

    v8::TryCatch try_catch;
    v8::Handle<v8::Script> script = v8::Script::Compile( js );

    if( script.IsEmpty() ) {
        report_exception( try_catch );
    }

    //start the breaker thread
    std::thread th( breaker, isolate, v8::V8::GetCurrentThreadId() );

    log_info( "running script" );
    script->Run();
    log_info( "Script execution finished" );

    th.join();
}
Run Code Online (Sandbox Code Playgroud)

但是,我总是在terminateExecution()通话中遇到段错误.我在这做错了什么?

谢谢你的帮助

Bit*_*tex 6

这些v8::V8::GetCurrentThreadId()v8::V8::TerminateExecution(int)方法已从V8 API中删除.我建议你不要使用它们.对于这个世界而言,抢占功能可能也不长.

相反,只需打电话v8::V8::TerminateExecution(v8::Isolate*).并且不要将隔离锁定在断路器线程中,因为这样做会阻塞,直到您的转轮线程释放隔离,直到脚本执行完成后才会执行此操作.

  • 太棒了!太糟糕了,没有任何可用的实际文档告诉您这些情况... (2认同)