我正在为 Node.js 编写一段 C 代码,并希望区分同步调用和异步调用。换句话说,我想检测我的代码是否在 V8 事件调度线程上运行,从主事件循环中调用,或者它是否从某个单独的工作线程调用。在前一种情况下,我可以立即回调 JavaScript,而在后一种情况下,我必须使用更复杂的异步回调。
libuv线程 API用于uv_thread_self
识别当前线程,并uv_thread_equal
比较线程是否相等。所以我需要的是找到uv_thread_t
主事件循环的。
我正在为 Node.js 编写一段 C 代码,并希望区分同步调用和异步调用。换句话说,我想检测我的代码是否在 V8 事件调度线程上运行,从主事件循环中调用,或者它是否从某个单独的工作线程调用。在前一种情况下,我可以立即回调 JavaScript,而在后一种情况下,我必须使用更复杂的异步回调。
libuv线程 API用于uv_thread_self
识别当前线程,并uv_thread_equal
比较线程是否相等。所以我需要的是找到uv_thread_t
主事件循环的。
我想它就像uv_thread_self()
在模块的初始化中从 v8 线程中获取一样简单(正如你提到的你使用 node.js)?该模块初始化代码应该从主 v8 线程运行,因为这是require()
从您的库的 Javascript 包中运行的。
uv_thread_t main_thread;
extern "C" void init(Handle<Object> target, Handle<Object> module) {
Nan::HandleScope scope;
main_thread = uv_thread_self();
然后您可以使用uv_thread_equal
来确定代码是否在主线程中运行:
void ozw_watcher_callback(OpenZWave::Notification const *cb, void *ctx)
// ===================================================================
{
uv_thread_t this_thread = uv_thread_self();
std::cout << "~~~~ ozw_watcher_callback : main thread? " << (uv_thread_equal(&main_thread, &this_thread)) << "\n";
在 Linux(可能还有 MacOS 和 Solaris)上,您可以查看backtrace()
:
backtrace()
在 .指向的数组中返回调用程序的回溯buffer
。回溯是程序当前活动的一系列函数调用。
它是朋友,backtrace_symbols()
:
给定
backtrace()
in 缓冲区返回的地址集,backtrace_symbols()
将地址转换为符号描述地址的字符串数组。size 参数指定缓冲区中的地址数。每个地址的符号表示由函数名(如果可以确定的话)、函数的十六进制偏移量和实际返回地址(十六进制)组成。
http://linux.die.net/man/3/backtrace
在 Windows 上,我认为以下问题显示了如何实现类似的功能: http ://bewitchingkitchen.com/2010/01/30/slow-roasted-chicken-thighs-an-ice-breaker/