c++ 获取线程id_高效获取当前线程的 id
生活随笔
收集整理的這篇文章主要介紹了
c++ 获取线程id_高效获取当前线程的 id
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
不同平臺獲取當前線程 id 的方法
- Windows
可以利用微軟提供的 api,輕松獲取當前線程的 id:
int id = GetCurrentThreadId();- Linux
Linux 平臺一般用的是 pthread 線程庫,但它并不提供獲取線程內部 id 的方法。可以通過系統調用得到當前線程的 id:
#include <unistd.h> // for syscall() #include <sys/syscall.h> // for SYS_xxx definitionsint id = syscall(SYS_gettid);- Mac
Mac 平臺也可以用 syscall 獲取當前線程的 id,與 Linux 稍有區別:
#include <unistd.h> // for syscall() #include <sys/syscall.h> // for SYS_xxx definitionsint id = syscall(SYS_thread_selfid); // for mac os x不過在 mac os x 10.12 之后,syscall 被標記為 deprecated,所以最好還是用下面的方法取代 syscall:
#include <pthread.h>uint64_t id; pthread_threadid_np(0, &id); // non-posix, supported by BSD基于 TLS 的優化
系統調用會在用戶態與內核態之間來回切換,相對比較耗時。為了避免頻繁的系統調用,可以用 TLS 優化,每個線程只需一次系統調用:
inline int tls_get_tid() {static __thread int id = 0;if (id != 0) return id;id = syscall(SYS_gettid);return id; }下面是一段簡單的測試代碼:
inline int sys_get_tid() {return syscall(SYS_gettid); }void fsys() {int v = 0;Timer t;for (int i = 0; i < 1000000; i++) {v = sys_get_tid();}int64 us = t.us();cout << "fsys use " << us << "us" << " id: " << v << endl; }void ftls() {int v = 0;Timer t;for (int i = 0; i < 1000000; i++) {v = tls_get_tid();}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 機制實現的。
總結
以上是生活随笔為你收集整理的c++ 获取线程id_高效获取当前线程的 id的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis jdbctype数据类型
- 下一篇: c++和c语言的区别_C 语言和 C++