[英]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.