gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:36 25 4
gpt4 key购买 nike

我想为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com