为什么 "Isolate::GerCurrent()" 在异步线程中为空?
Why is "Isolate::GerCurrent()" Null in asynchronous thread?
我的最终目标是解决这个 problem,但我在一些非常基本的东西上卡住了。
我的整个C++ Module基本如下:
void AsyncWork(void *arg) {
Isolate* isolate = Isolate::GetCurrent(); // isolate is NULL
if (isolate != NULL) {
HandleScope scope(isolate);
}
else {
printf("isolate is null\n");
return;
}
// ...
}
void testAsync(const FunctionCallbackInfo<Value>& args) {
uv_thread_t id;
int data = 10;
uv_thread_create(&id, AsyncWork, &data);
}
void init(Handle<Object> target) {
NODE_SET_METHOD(target, "testAsync", testAsync);
}
NODE_MODULE(MyCppModule, init);
为什么我在 AsyncWork 中调用 Isolate::GetCurrent()
后 isolate
为 NULL?
好吧,我好像设置错了,不应该在工作线程中调用 Isolate::GetCurrent()
。而是在主线程上注册一个回调。
static uv_async_t async;
static int i;
void AsyncWork(void *arg) {
for (i = 0; i < 5; ++i) {
async.data = (void*)&i;
uv_async_send(&async);
Sleep(1000);
}
}
void testCallback(uv_async_t *handle) {
Isolate* isolate = Isolate::GetCurrent();
if (isolate != NULL) {
HandleScope scope(isolate);
printf("Yay\n");
}
else {
printf("isolate is null\n");
}
int data = *((int*)handle->data);
printf("data: %d\n", data);
}
void testAsync(const FunctionCallbackInfo<Value>& args) {
uv_thread_t id;
int data = 10;
uv_async_init(uv_default_loop(), &async, testCallback);
uv_thread_create(&id, AsyncWork, &data);
}
void init(Handle<Object> target) {
NODE_SET_METHOD(target, "testAsync", testAsync);
}
NODE_MODULE(MyCppModule, init);
我的最终目标是解决这个 problem,但我在一些非常基本的东西上卡住了。
我的整个C++ Module基本如下:
void AsyncWork(void *arg) {
Isolate* isolate = Isolate::GetCurrent(); // isolate is NULL
if (isolate != NULL) {
HandleScope scope(isolate);
}
else {
printf("isolate is null\n");
return;
}
// ...
}
void testAsync(const FunctionCallbackInfo<Value>& args) {
uv_thread_t id;
int data = 10;
uv_thread_create(&id, AsyncWork, &data);
}
void init(Handle<Object> target) {
NODE_SET_METHOD(target, "testAsync", testAsync);
}
NODE_MODULE(MyCppModule, init);
为什么我在 AsyncWork 中调用 Isolate::GetCurrent()
后 isolate
为 NULL?
好吧,我好像设置错了,不应该在工作线程中调用 Isolate::GetCurrent()
。而是在主线程上注册一个回调。
static uv_async_t async;
static int i;
void AsyncWork(void *arg) {
for (i = 0; i < 5; ++i) {
async.data = (void*)&i;
uv_async_send(&async);
Sleep(1000);
}
}
void testCallback(uv_async_t *handle) {
Isolate* isolate = Isolate::GetCurrent();
if (isolate != NULL) {
HandleScope scope(isolate);
printf("Yay\n");
}
else {
printf("isolate is null\n");
}
int data = *((int*)handle->data);
printf("data: %d\n", data);
}
void testAsync(const FunctionCallbackInfo<Value>& args) {
uv_thread_t id;
int data = 10;
uv_async_init(uv_default_loop(), &async, testCallback);
uv_thread_create(&id, AsyncWork, &data);
}
void init(Handle<Object> target) {
NODE_SET_METHOD(target, "testAsync", testAsync);
}
NODE_MODULE(MyCppModule, init);