在libuv工作线程中使用指针隔离
Using a pointer to Isolate in libuv worker thread
我尝试开发一个异步Node.js插件,与隔离工作。
考虑这个示例代码:
struct Work {
uv_work_t request;
Persistent<Function> callback;
Isolate * isolate;
};
// called in worker thread
static void WorkAsync(uv_work_t *req)
{
Work *work = static_cast<Work *>(req->data);
HeapStatistics stats;
work->isolate->GetHeapStatistics(&stats);
// ... do other stuff ...
}
// called by in main thread
static void WorkAsyncComplete(uv_work_t *req, int status)
{
Isolate * isolate = Isolate::GetCurrent();
v8::HandleScope handleScope(isolate);
Work *work = static_cast<Work *>(req->data);
// ... do other stuff ...
work->callback.Reset();
delete work;
}
void RunAsync(const v8::FunctionCallbackInfo<v8::Value>&args) {
Isolate* isolate = args.GetIsolate();
Work * work = new Work();
work->request.data = work;
work->isolate = isolate;
Local<Function> callback = Local<Function>::Cast(args[0]);
work->callback.Reset(isolate, callback);
// kick of the worker thread
uv_queue_work(uv_default_loop(), &work->request, WorkAsync, WorkAsyncComplete);
args.GetReturnValue().Set(Undefined(isolate));
}
void setup(Handle <Object> exports, Handle<Object> module) {
NODE_SET_METHOD(exports, "run", RunAsync);
}
NODE_MODULE(addon, setup)
我的问题:将指针传递到当前隔离到工作线程(用于只读目的)是否安全?
谢谢!
Scott Frees的回答( c++和Node.js集成的作者电子书:https://scottfrees.com/ebooks/nodecpp/):
老实说,我从来没有试过那样做。在我看来,这应该是好的——只要你只是在隔离上调用,而不是实际修改其中的任何内容。
一般来说,如果你试图做任何违反V8线程模型的事情,它将生成一个异常-所以如果它不是,那么我认为它是ok的。
这是可能的。但是,你要对安全负责。您需要确保将Isolate从父线程中分离出来并解锁。然后它可以在工作线程中使用(enter)。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- 带内存和隔离功能的SQLite
- C++将浮点指针值舍入为小数位数
- 通过 Boost Python 在C++对象之间传递共享指针的隔离错误
- 无效指针、隔离标识符等
- 指向数组访问的指针上的隔离错误
- C++ 结构指针隔离错误
- 在libuv工作线程中使用指针隔离