1. 程式人生 > >獲取執行緒ID:利用關鍵字__thread減少系統呼叫使用次數

獲取執行緒ID:利用關鍵字__thread減少系統呼叫使用次數

 一、獲取當前執行緒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多執行緒服務端程式設計