c 獲取執行緒id 高效獲取當前執行緒的 id

2021-10-11 06:23:09 字數 1432 閱讀 9754

可以利用微軟提供的 api,輕鬆獲取當前執行緒的 id:

int id = getcurrentthreadid();

linux 平台一般用的是 pthread 執行緒庫,但它並不提供獲取執行緒內部 id 的方法。可以通過系統呼叫得到當前執行緒的 id:

#include // for syscall()

#include // for sys_*** definitions

int id = syscall(sys_gettid);

mac 平台也可以用syscall獲取當前執行緒的 id,與 linux 稍有區別:

#include // for syscall()

#include // for sys_*** definitions

int id = syscall(sys_thread_selfid); // for mac os x

不過在 mac os x 10.12 之後,syscall 被標記為deprecated,所以最好還是用下面的方法取代 syscall:

#include uint64_t id;

pthread_threadid_np(0, &id); // non-posix, supported by bsd

系統呼叫會在使用者態與核心態之間來回切換,相對比較耗時。為了避免頻繁的系統呼叫,可以用 tls 優化,每個執行緒只需一次系統呼叫:

inline int tls_get_tid()

下面是一段簡單的測試**:

inline int sys_get_tid() 

void fsys()

int64 us = t.us();

cout << "fsys use " << us << "us" << " id: " << v << endl;

}void ftls()

int64 us = t.us();

cout << "ftls use " << us << "us" << " id: " << v << endl;

}

在 linux 系統編譯執行結果如下:

# ./xx

fsys use 299251us id: 71

ftls use 2675us id: 71

可以看到tls版本效能提公升了將近 100 倍,效果非常明顯。

在 windows 上也進行了類似的測試,結果表明 tls 對效能沒什麼影響,可能 windows 的 api 內部就是用 tls 機制實現的。

Windows Linux下獲取當前執行緒的ID號

序 在多執行緒場合,為了方便跟蹤執行緒的執行狀態,往往需要在程式中新增列印當前執行緒id號的功能。1.linux下列印當前執行緒idpthread t pthread self 2.windows下列印當前執行緒iddword getcurrentthreadid ifdef win32 inclu...

獲取當前執行緒,執行緒id,設定優先順序等函式介面

winbaseapi handle winapi getcurrentthread void winbaseapi dword winapi getcurrentthreadid void winbaseapi dword winapi getprocessidofthread handle thr...

std thread中獲取當前執行緒的系統id

std thread不提供獲取當前執行緒的系統id的方法,僅可以獲取當前的執行緒id,但是我們可以通過建立索引表的方式來實現 1 std mutex m 2 std mapthreads 3void48 void wrap void f 9 而後用其建立執行緒 1 std thread t1 wra...