Node.js C ++插件:来自不同线程的多个回调

时间:2012-07-09 07:28:19

标签: multithreading node.js

我正在创建一个节点C ++插件,它应该回调一个js函数,因为事件是由一些不受我控制的其他线程触发的(它实际上是我使用的托管dll的.net线程)。由于JS世界是单线程的,我不能只保留js函数引用并从非js线程调用它。我甚至无法创建我想要传递给该线程上的回调函数的参数。

我已经看到uv_queue_work用于你想要从js线程移出工作的情况,并且一旦完成并从js线程调用回来做你需要做的任何事情,例如回调一个js函数。

供以后参考,这是该函数的签名:

int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb,
uv_after_work_cb after_work_cb);

调用uv_queue_work适用于一次性工作,我可以通过将来自uv_queue_work的{​​{1}}的来电链接到after_work_cb来随意调用我,而work_cb与其他工作同步线程,但我想知道是否有更简单的方法来做到这一点。

类似于node.js提供的fn,它可以被任何其他线程直接调用,其中fn指针指向下一次要在主js线程上执行的代码。有什么想法吗?

1 个答案:

答案 0 :(得分:7)

您应该查看uv_async_ *函数(查看https://github.com/joyent/libuv/blob/master/include/uv.h),而不是使用uv_queue_work。

可以在节点sqllite项目https://github.com/developmentseed/node-sqlite3/blob/master/src/async.h中找到非常好的实现。

但是,如果你不是非常小心这些东西,你最终会得到一些可怕的循环引用计数错误(应用程序退出到早期,或者根本没有)