【发布时间】:2012-06-18 10:43:03
【问题描述】:
我在 node.js c++ 插件中使用 uv_queue_work 做一些并行工作。
一切正常,直到我尝试从 Complete 方法回调 JS。
我得到:CHECK(thread_local_top()->TryCatchHandler() == that) 失败。
关于可能导致此问题的任何指针?
我正在使用以下代码进行回调:
//Get emit method from JS object and check !IsEmpty and IsFunction
v8::TryCatch tc;
emit->Call(pxy,1,argv); // The error happens in this statement.
if (tc.HasCaught()){
//Some handler code
}
【问题讨论】:
-
在我看来,您正试图从另一个线程调用回调。您能否发布更多代码,例如您是如何使用 uv_queue_work 的?
-
这也是我的第一个想法,我之前确实运行了以下实用程序方法,据我了解,如果不在 V8 线程上,它应该返回 false。
bool Util::V8Thread(){ return v8::Isolate::GetCurrent() != NULL; };我正在使用以下命令启动进程: uv_queue_work(loop,baton,Worker,WorkerComplete);并且错误发生在“WorkerComplete”中 -
断言表明 try catch 处理程序堆栈不知何故变得不平衡。如果没有看到更多代码或至少来自 gdb 的堆栈跟踪,很难猜测为什么。
-
感谢您提供有用的错误描述!现在我知道要寻找什么了 :) 代码非常复杂,所以我想我将尝试在一个简单的项目中重现。 GDB 堆栈只是显示了 uv 方法和完整的回调......希望我能深入了解这个!