在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