可以利用微軟提供的 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...