Node.js C ++ addon:来自不同线程的多个callback

我正在创build一个节点C ++插件,应该callback一个JS函数,因为事件是由不在我的控制下的其他线程触发的(它实际上是一个来自我使用的托pipeDLL的.NET线程)。 由于JS世界是单线程的,我不能只保留js函数引用,并从非js线程调用它。 我甚至不能创build我想传递给该线程callback函数的参数。

我已经看到uv_queue_work被用在你想要从js线程移出工作的情况下,并且一旦完成并从js线程callback来做你需要做的任何事情,比如callback一个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对于一次性工作是很好的,我可能会经常通过从after_work_cb链接调用uv_queue_work来调用我,而work_cb与其他线程同步,但是我不知道是否没有更直接的方法这样做。

就像node.js提供的fn一样,它可以被任何其他线程直接调用,而fn指针指向下一次在主js线程上执行的代码。 任何想法?

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

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

不过要注意的是,如果你对这些东西不是非常小心的话,你最终会遇到一些TERRIBLE循环引用计数错误(应用程序退出提前,或根本不提供)