首页 > ceph bluestore源码分析:C++ 获取线程id

ceph bluestore源码分析:C++ 获取线程id

阅读ceph源码过程中需要明确当前操作是由哪个线程发出,此时需要根据线程id来确认线程名称

C++获取线程id是通过系统调用来直接获取

函数描述

头文件:

函数名称:syscall(SYS_gettid)

该函数直接返回了一个pid_t int类型的数字,即为当前线程id

此外函数pthread_self同样能够获取线程id,但是该函数获取到的线程id为posix的线程id,并不是真实的线程id.所以最后获取到的数值是一个特别长的标识,并非top -Hp pid中的实际线程id

函数使用

编写如下代码:

#include 
#include 
#include 
#include 
#include 
#include 
#define gettid() syscall(SYS_gettid)
using namespace std;void *threadFunc(void *p)
{ printf("go into threadfunc ,pthread_self id is %d
",pthread_self());printf("go into  threadfunc ,gettid id is %d 
",gettid());int i = 0;while(1){ i++;sleep(1);}return NULL;
}int main()
{ printf("man thread  tid is %d 
 man pid is %d
",gettid(),getpid());pthread_t id;pid_t tid;pthread_create (&id, NULL, threadFunc, NULL);pthread_create (&id, NULL, threadFunc, NULL);pthread_create (&id, NULL, threadFunc, NULL);int i=0;while (1){ i++;sleep(1);}return 0;
}

运行结果如下:

[root@node1 ~]# ./a.out 
man thread  tid is 28244 man pid is 28244
go into threadfunc ,pthread_self id is -1511180544
go into  threadfunc ,gettid id is 28245 
end and get the tgkill tid is -1
go into threadfunc ,pthread_self id is -1527965952
go into threadfunc ,pthread_self id is -1519573248
go into  threadfunc ,gettid id is 28246 
go into  threadfunc ,gettid id is 28247 

同时使用命令查看得到如下输出

[root@node1 ~]# ps -ef|grep a.out
root     28244 21581  0 09:41 pts/10   00:00:00 ./a.out
root     28902  8965  0 09:41 pts/7    00:00:00 grep --color=auto a.out
[root@node1 ~]# ps -Tp 28244  PID  SPID TTY          TIME CMD
28244 28244 pts/10   00:00:00 a.out
28244 28245 pts/10   00:00:00 a.out
28244 28246 pts/10   00:00:00 a.out
28244 28247 pts/10   00:00:00 a.out

命令ps -Tp pid同样可以得到当前进程相关的信息,第二列SPID即为线程id.可以看到进程id和主线程id是一致的,同时pthread_self函数的posix 线程id并非我们实际真实的线程id

更多相关:

  •     先吐为敬!   最近心血来潮研究nodejs如何完成微信支付功能,结果网上一搜索,一大堆“代码拷贝党”、“留一手”、“缺斤少两”、“不说人话”、“自己都没跑通还出来发blog”、“各种缺少依赖包”、“各种注释都没有”、“自己都不知道在写什么”的程序大神纷纷为了增加自己博客一个帖子的名额而发布了各种千奇百�...

  • 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一个全局唯一的 id 来支持。所以这都是你实际生产环境中必须考虑的问题。 面试题剖析 基于数据库的实现方案 数据库自增 id 这个就是说你的...

  • ORM操作    单表、一对多表操作 1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models.CharField(max_length=32) 6 7 8 class UserInfo(m...

  • 建立如下表: 建表语句: class表创建语句 create table class(cid int not null auto_increment primary key, caption varchar(32) not null)engine=innodb default charset=utf8;student表创建语句 c...

  • 多线程有什么好处?提高CPU的利用率,更好地利用系统资源,使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段,使用不同的同步类创建自己的同步机制。多线程指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程提升整体处理性能。多线程是指程序中包含多个执行流,即...

  • Step1:在界面主函数的构造函数中初始化多线程 auto mythread = new QThread(); //新建connect(mythread , &QThread::finished, mythread, &QObject::deleteLater);//线程运行结束后释放内存object1->moveToThread...

  • 一、thread的基本用法 参见C++使用thread类多线程编程 。 二、类外使用多线程,访问类的成员 这几种方式,新建线程都是在类外,然后通过把友元函数或者成员函数作为thread参数。 #include #include #include using namesp...

  • 本博文是根据中科大信息学院谭立湘老师的课件加上自己的理解整理出来的 ************************************************************************************ NVIDIA在2007年推出CUDA这个统一计算架构 CUDA的基本思想是支持大量的线程级并...

  • 一、parallel communication patterns   并行通信模式 Map:映射,在特定的位置读取和写入。 Gather:收集,从多个不同的位置读入,写入一个位置。 Scatter:分发,写入多个位置。 Transpose转置 结构数组缩写为AOS,数组结构缩写为SOA 转置运算是指任务重新排序内存中的数...

  • 转自:http://stackoverflow.com/questions/8377091/what-are-the-differences-between-cv-8u-and-cv-32f-and-what-should-i-worry-about CV_8U is unsigned 8bit/pixel - ie a pixel...