1

我正在为 Node.js 编写一段 C 代码,并希望区分同步调用和异步调用。换句话说,我想检测我的代码是否在 V8 事件调度线程上运行,从主事件循环中调用,或者它是否从某个单独的工作线程调用。在前一种情况下,我可以立即回调 JavaScript,而在后一种情况下,我必须使用更复杂的异步回调。

libuv线程 API用于uv_thread_self识别当前线程,并uv_thread_equal比较线程是否相等。所以我需要的是找到uv_thread_t主事件循环的。

4

2 回答 2

1

我想它就像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";
于 2015-12-06T09:52:47.403 回答
0

在 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/

于 2015-01-30T13:39:50.497 回答