【发布时间】:2015-01-30 12:58:56
【问题描述】:
我正在为 Node.js 编写一段 C 代码,并且想区分同步调用和异步调用。换句话说,我想检测我的代码是否在 V8 事件调度线程上运行,从主事件循环中调用,或者它是否从某个单独的工作线程调用。在前一种情况下,我可以立即回调 JavaScript,而在后一种情况下,我必须使用更复杂的异步回调。
libuv threading API 提供 uv_thread_self 来识别当前线程,并提供 uv_thread_equal 来比较线程是否相等。所以我只需要找到主事件循环的uv_thread_t。
【问题讨论】:
-
我很困惑怎么可能有不知道它在哪个线程上运行的代码。任何回调都将在排队的同一线程上运行,并且 libuv 无论如何都不是线程安全的,因此您不能将来自不是事件循环线程的线程的回调排队。
-
我正在处理libxslt extension functions。因此,我正在编写 C 代码,该代码将注册到 XSLT 库的全局数据结构中,并且将从 XSLT 处理器中调用,而 XSLT 处理器又可以同步或异步调用。目前我最好的选择是在函数注册时从
uv_thread_self保存结果,假设它始终是主事件循环线程。但我仍然想知道是否还有比这更优雅的东西。
标签: c node.js multithreading event-loop libuv