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

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

libuv线程API提供了uv_thread_self来标识当前线程,而uv_thread_equal提供了相等的线程比较。 所以我需要find主事件循环的uv_thread_t

我想它就像在模块的初始化过程中从v8线程抓取uv_thread_self()一样简单(正如你所说的使用node.js)? 这个模块的init代码应该从主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"; 

在Linux(也可能是MacOS和Solaris)上,你可以看看backtrace()

backtrace()buffer指向的数组中的调用程序返回一个回溯。 回溯是程序当前正在进行的一系列函数调用。

这是朋友, backtrace_symbols()

给定backtrace()在缓冲区中返回的一组地址, backtrace_symbols()将地址转换为一个string数组,用于象征性地描述地址。 size参数指定缓冲区中的地址数量。 每个地址的符号表示forms由函数名称(如果可以确定),函数的hex偏移量和实际返回地址(hex)组成。

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

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