簡體   English   中英

檢測當前線程是否是libuv默認事件循環的主線程

[英]Detect whether current thread is main thread of the libuv default event loop

我正在為Node.js寫一段C代碼,想區分同步調用和異步調用。 換句話說,我想檢測我的代碼是否在V8事件分配線程上運行(從主事件循環中調用),還是從某個單獨的工作線程中調用。 在前一種情況下,我可以立即回調JavaScript,而在后一種情況下,我必須使用更復雜的異步回調。

libuv線程API提供uv_thread_self來標識當前線程,並提供uv_thread_equal來比較線程是否相等。 因此,我需要找到主事件循環的uv_thread_t

我想它就像在模塊初始化中從v8線程中獲取uv_thread_self()一樣簡單(就像您提到的那樣,您使用的是node.js)? 該模塊初始化代碼應該從v8主線程運行,因為這是庫Javascript包中的require() d。

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。 回溯是程序的當前活動函數調用的序列。

是朋友backtrace_symbols()

給定緩沖區中backtrace_symbols()返回的地址集, backtrace() backtrace_symbols()地址轉換為以符號形式描述地址的字符串數組。 size參數指定緩沖區中的地址數。 每個地址的符號表示由函數名稱(如果可以確定),函數中的十六進制偏移量和實際返回地址(十六進制)組成。

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

在Windows上,我認為以下問題說明了如何實現類似的功能: http : //bewitchingkitchen.com/2010/01/30/slow-roasted-chicken-thighs-an-ice-breaker/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM