我正在为Node.js编写一段C代码,并希望区分同步和异步调用。换句话说,我想检测我的代码是否在V8事件调度线程上运行,从主事件循环中调用,或者是否从某个单独的工作线程调用它。在前一种情况下,我可以立即回调JavaScript,而在后一种情况下,我必须使用更复杂的异步回调。
libuv threading API提供uv_thread_self
来标识当前线程,uv_thread_equal
来比较线程是否相等。所以我需要的是找到主事件循环的uv_thread_t
。
答案 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/