检测当前线程是否是libuv默认事件循环的主线程

时间:2015-01-30 12:58:57

标签: c node.js multithreading event-loop libuv

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

libuv threading API提供uv_thread_self来标识当前线程,uv_thread_equal来比较线程是否相等。所以我需要的是找到主事件循环的uv_thread_t

2 个答案:

答案 0 :(得分:1)

我认为它就像在模块的初始化中从v8线程中抓取uv_thread_self()一样简单(正如你提到的那样使用node.js)? 这个模块初始化代码应该从主v8线程运行,因为它是来自你库的Javascript包的require()

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";

答案 1 :(得分:0)

在Linux(可能还有MacOS和Solaris)上,您可以查看backtrace()

  

backtrace()返回数组中调用程序的回溯   由buffer指出。回溯是当前活跃的系列   函数调用该程序。

这是朋友,backtrace_symbols()

  

给定backtrace()在缓冲区中返回的地址集,   backtrace_symbols()将地址转换为字符串数组   以符号形式描述地址。 size参数指定   缓冲区中的地址数。每个人的象征性表征   地址由函数名称组成(如果可以确定),a   函数的十六进制偏移量,以及实际的返回地址   (十六进制)。

http://linux.die.net/man/3/backtrace

在Windows上,我认为以下问题显示了如何实现类似的功能: http://bewitchingkitchen.com/2010/01/30/slow-roasted-chicken-thighs-an-ice-breaker/