獲取執行緒ID:利用關鍵字__thread減少系統呼叫使用次數
阿新 • • 發佈:2018-12-18
一、獲取當前執行緒ID的方法
#include <unistd.h>
#include <sys/syscall.h>
#define gettid() syscall(__NR_gettid)
pid_t tid=gettid(); //current thread id
pid_t pid=getpid(); //current process id
系統呼叫次數會影響程式的效能。如果有多個類需要檢視當前執行緒ID,首先想到的方法就是定義個全域性變數,但是在多執行緒中就會導致頻繁呼叫系統函式降低效能,而且定義全域性變數總是一個壞想法。
考慮到這些問題,關鍵字__thread可以很好地幫助我們解決問題。
二、善用__thread關鍵字
__thread是GCC內建的執行緒區域性儲存設施(thread local storage)。它的實現非常高效。__thread變數是每個執行緒有一份獨立實體,各個執行緒的變數值互不干擾。除了這個主要用途,它還可以修飾那些“值可能會變,帶有全域性性,但是又不值得用全域性鎖保護”的變數。
需要注意的是它的使用規則:只能用於修飾POD型別(Plain old data structure),不能修飾class型別,因為無法自動呼叫建構函式和解構函式。__thread可以用於修飾全域性變數、函式內的靜態變數,但是不能用於修飾函式的區域性變數或者class的普通成員變數。另外,__thread變數的初始化只能用編譯期常量。
#include <sys/syscall.h> //#define gettid() syscall(__NR_gettid) pid_t gettid() { return static_cast<pid_t>(syscall(SYS_gettid)); } __thread pid_t t_cachedTid = 0; pid_t CurrentThreadtid() { if (t_cachedTid == 0) { t_cachedTid = gettid(); } return t_cachedTid; }
此後各個執行緒只需呼叫底層函式CurrentThreadtid()就可以獲得當前執行緒的ID,且只在最初使用時呼叫一次系統呼叫,此後都直接獲取t_cacheTid所儲存的值。
參考資料:
Linux多執行緒服務端程式設計