所以,我正在使用
v8
板条箱,它是 V8 引擎的 C++ 代码的绑定。我将其部署到单个工作线程并具有多个请求线程。每个请求线程将数据发送到该工作线程,然后工作线程将其转发到 V8 引擎,并将结果发送回原始线程。如果只有一个请求,一切都会正常进行。但是,当存在并发请求时,即使只有 2 个并发请求,也会导致如下所示的分段错误:
Segmentation fault (core dumped)
错误信息就是这样。我的代码如下所示:
let platform = v8::new_default_platform(0, false).make_shared();
v8::V8::initialize_platform(platform);
v8::V8::initialize();
let isolate = &mut v8::Isolate::new(Default::default())));
while let Ok((data, result_sender)) = receiver.recv() {
let scope = &mut v8::HandleScope::new(isolate);
let context = v8::Context::new(scope, Default::default());
let scope = &mut v8::ContextScope::new(scope, context);
let code = v8::String::new(scope, &data).unwrap();
let script = v8::Script::compile(scope, code, None).unwrap();
let result = script.run(scope).unwrap();
let result = result.to_string(scope).unwrap();
result_sender.send(result.to_rust_string_lossy(scope)).unwrap();
}
上面的代码是导致分段错误的代码,因为当我注释掉该部分时,分段错误不再发生。如果我总是创建一个新的隔离,一切都会正常工作,没有任何分段错误,但我不想使用这种方法,因为它会导致非常显着的性能下降。
为什么会发生这种分段错误?我的代码有问题吗?如何解决?还是V8引擎本身的bug?
(这里是 V8 开发者。)
一次只有一个线程可以访问
v8::Isolate
。您有责任使用储物柜(v8::Locker
,或您自己的)来确保这一点。
如果多个线程同时访问同一个 Isolate,您会看到崩溃。这不是 V8 错误——而是代码中的错误。
查看
v8::Isolate
和v8::Locker
的评论了解更多详情。