天天看點

Linux C/C++ 擷取程序号、線程号和設定線程名

在Linux開發過程中,設計多線程開發時可以将程序和線程的 id 列印出來,友善開發調試和後期查問題使用,同時也包括設定線程名。

1 前言

在Linux開發過程中,設計多線程開發時可以将程序和線程的 id 列印出來,友善開發調試和後期查問題使用,同時也包括設定線程名。

2 函數及頭檔案

2.1 程序ID

#include <unistd.h>

pid_t getpid(void);           

2.2 線程ID

Linux中,每個程序有一個pid,類型pid_t,由

getpid()

取得。Linux下的POSIX線程也有一個id,類型 pthread_t,由pthread_self()取得,該id由線程庫維護,其id空間是各個程序獨立的(即不同程序中的線程可能有相同的id)。Linux中的POSIX線程庫實作的線程其實也是一個程序(LWP),隻是該程序與主程序(啟動線程的程序)共享一些資源而已,比如代碼段,資料段等。

由于

gettid()

在 glibc 中未實作該函數,是以我們自己可以通過 Linux 的系統調用

syscall

實作

#include <sys/unistd.h>

#define gettid() syscall(__NR_gettid)

/* 第二種 */
#include <sys/syscall.h>

#define gettid() syscall(SYS_gettid)  // #define SYS_gettid __NR_gettid 在 sys/syscall.h 中定義           

當隻有一個線程的時候,傳回的是pid。

2.3 設定線程名

#include <prctl.h>

prctl(PR_SET_NAME, "testThread"); 

// 可以通過設定 PR_GET_NAME 擷取目前線程的名字           

2.4 示例

需要線上程函數中調用

#include <sys/prctl.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <thread>
#include <stdio.h>
#include <string.h>

#define gettid() syscall(SYS_gettid)

void TestThreadBody(int threadNumber)
{
    char szThreadName[20];
    
    snprintf(szThreadName, 20, "testThread-%d", threadNumber);
    prctl(PR_SET_NAME, szThreadName); 
    
    memset(szThreadName, 0, 20);
    prctl(PR_GET_NAME, szThreadName); 
    
    printf("Thread[%s] pid:%u, tid:%u\n", szThreadName, (unsigned int)getpid(), (unsigned int)gettid());
}

int main()
{
    char szThreadName[20];
    prctl(PR_SET_NAME, "mainThread"); 
    prctl(PR_GET_NAME, szThreadName); 
    printf("Thread[%s] pid:%u, tid:%u\n", szThreadName, (unsigned int)getpid(), (unsigned int)gettid());
    
    std::thread(TestThreadBody, 1).detach();
    std::thread(TestThreadBody, 2).detach();
    std::thread(TestThreadBody, 3).detach();

    return 0;
}           

本文來自部落格園,作者:大橙子瘋,轉載請注明原文連結:https://www.cnblogs.com/const-zpc/p/16434027.html

繼續閱讀