日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ 获取线程id_高效获取当前线程的 id

發布時間:2025/3/20 c/c++ 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。