1. 前置知识
(1)gettid 内核给线程(轻量级进程)分配的进程id,全局(所有进程中)唯一;
(2)pthread_self()是在用户态实现的,获取的是相对于进程的线程控制块的首地址,只是在当前进程空间中是唯一的。不能保证同一进程先后多个线程具有不同的id。(当前一个线程结束其生命周期,进程又新创建了一个线程,那么该线程ID可能会使用消亡线程的ID)。
(3)struct timespec
{
__time_t tv_sec; /* 秒数 long int */
long tv_nsec; /* 纳秒数*/
};
2. 代码
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include<sys/syscall.h>
/* 没有gettid函数,我们可以自己封装一下 */
pid_t gettid()
{
return syscall(SYS_gettid);
}
/* 获取时间 */
static unsigned long long GetTickMs()
{
unsigned long long nTimeV[2] = {0};
struct timespec nTime; //linux中用的时间结构
clock_gettime(CLOCK_MONOTONIC,&nTime); //CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响
nTimeV[0] = nTime.tv_sec * 1000; //转为ms
nTimeV[1] = nTime.tv_nsec / 1000000; //转为ms
return (nTimeV[0] + nTimeV[1]); //返回当前的时间是多少 ms
}
int main()
{
unsigned long long nTimeVal[2] = {0};
nTimeVal[0] = GetTickMs();
for(int i = 0; i < 10000000; i++)
{
}
nTimeVal[1] = GetTickMs();
printf("Thread pid:%u, tid:%u, spend: %lldms \n", (unsigned int)getpid(), (unsigned int)gettid(), nTimeVal[1]- nTimeVal[0]);
return 0;
}