c++ 获取线程id_高效获取当前线程的 id
生活随笔
收集整理的這篇文章主要介紹了
c++ 获取线程id_高效获取当前线程的 id
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
不同平臺獲取當(dāng)前線程 id 的方法
- Windows
可以利用微軟提供的 api,輕松獲取當(dāng)前線程的 id:
int id = GetCurrentThreadId();- Linux
Linux 平臺一般用的是 pthread 線程庫,但它并不提供獲取線程內(nèi)部 id 的方法??梢酝ㄟ^系統(tǒng)調(diào)用得到當(dāng)前線程的 id:
#include <unistd.h> // for syscall() #include <sys/syscall.h> // for SYS_xxx definitionsint id = syscall(SYS_gettid);- Mac
Mac 平臺也可以用 syscall 獲取當(dāng)前線程的 id,與 Linux 稍有區(qū)別:
#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 被標(biāo)記為 deprecated,所以最好還是用下面的方法取代 syscall:
#include <pthread.h>uint64_t id; pthread_threadid_np(0, &id); // non-posix, supported by BSD基于 TLS 的優(yōu)化
系統(tǒng)調(diào)用會在用戶態(tài)與內(nèi)核態(tài)之間來回切換,相對比較耗時。為了避免頻繁的系統(tǒng)調(diào)用,可以用 TLS 優(yōu)化,每個線程只需一次系統(tǒng)調(diào)用:
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 系統(tǒng)編譯執(zhí)行結(jié)果如下:
# ./xx fsys use 299251us id: 71 ftls use 2675us id: 71可以看到 TLS 版本性能提升了將近 100 倍,效果非常明顯。
在 windows 上也進(jìn)行了類似的測試,結(jié)果表明 TLS 對性能沒什么影響,可能 windows 的 api 內(nèi)部就是用 TLS 機制實現(xiàn)的。
總結(jié)
以上是生活随笔為你收集整理的c++ 获取线程id_高效获取当前线程的 id的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis jdbctype数据类型
- 下一篇: python class和def的区别_