获取进程的PID(process ID)

#include <unistd.h>
pid_t getpid(void);

获取线程的TID(thread ID)

1)gettid或者类似gettid的方法  :获取内核中真实的线程ID

2)直接调用pthread_self() : posix描述的线程ID。

  在POSIX线程库下每一线程也有一个ID,类型pthread_t,就是通过pthrea_self()得到的。该ID由线程库维护,每一个进程下的线程ID可能相同。

  Linux下POSIX线程库实现的线程其实也是一个进程(LWP),该进程与main(启动线程的进程)共享一些资源,比如代码段、数据段等。

详细:

  man一下gettid得到如下结果:

NAME
gettid - get thread identification SYNOPSIS
#include <sys/types.h> pid_t gettid(void); Note: There is no glibc wrapper for this system call; see NOTES. DESCRIPTION
gettid() returns the caller's thread ID (TID). In a single-threaded
process, the thread ID is equal to the process ID (PID, as returned by
getpid()). In a multithreaded process, all threads have the same PID,
but each one has a unique TID. For further details, see the discussion
of CLONE_THREAD in clone().

  gettid返回调用者的线程ID;在单线程的进程中,tid=pid(线程id),在多线程进程中,不同的线程,所有的线程又相同的pid。

  man一下pthread_self:

SYNOPSIS
#include <pthread.h> pthread_t pthread_self(void); Compile and link with -pthread. DESCRIPTION
The pthread_self() function returns the ID of the calling thread. This
is the same value that is returned in *thread in the pthread_create()
call that created this thread.

  pthread_self返回的是posix定义的线程ID,与内核tid不同。作用是可以用来区分同一进程中不同的线程。

++ pthread

  pthread是POSIX线程(POSIX threads)简称pthread,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。

转:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/wait.h>
//#include <sys/syscall.h> #define __NR_gettid 186
void *f()
{
int status;
printf("begin: pid: %d, tid:%ld, self: %ld\n", getpid(), (long int)syscall(__NR_gettid), pthread_self());
int ret = fork();
if(ret == ){
printf("[child] pid: %d, tid:%ld, self: %ld\n", getpid(), (long int)syscall(__NR_gettid), pthread_self());
}else if(ret > ){
printf("[parent] pid: %d, tid:%ld, self: %ld\n", getpid(), (long int)syscall(__NR_gettid), pthread_self());
waitpid(-, &status, );
}
} int main()
{ int i = ;
pthread_t pth[];
while(i++<){
pthread_create(&pth[i], NULL, f, NULL);
sleep();
}
pause();
}

So Why? 有两个进程ID(thread ID)

  描述线程的id,为什么需要两个不同的ID呢?这是因为线程库实际上由两部分组成:内核的线程支持+用户态的库支持(glibc),Linux在早 期内核不支持线程的时候glibc就在库中(用户态)以纤程(就是用户态线程)的方式支持多线程了,POSIX thread只要求了用户编程的调用接口对内核接口没有要求。

  linux上的线程实现就是在内核支持的基础上以POSIX thread的方式对外封装了接口,所以才会有两个ID的问题。

getpid 与 gettid 与 pthread_self的更多相关文章

  1. gettid和pthread_self区别

    http://blog.csdn.net/rsyp2008/article/details/45150621 1 线程ID获取方法 Linux下获取线程有两种方法: 1)gettid或者类似getti ...

  2. gettid 和pthread_self的区别

    转: Linux中,每个进程有一个pid,类型pid_t,由getpid()取得.Linux下的POSIX线程也有一个id,类型 pthread_t,由pthread_self()取得,该id由线程库 ...

  3. gettid()和pthread_self()的区别

    Linux中,每个线程有一个tid,类型long,由sys_gettid()取得. Linux内核中并没有实现线程,而是由glibc线程库实现的POSIX线程.每个线程也有一个id,类型 pthrea ...

  4. Linux2.6内核实现的是NPTL

    NPTL是一个1×1的线程模型,即一个线程对于一个操作系统的调度进程,优点是非常简单.而其他一些操作系统比如Solaris则是MxN的,M对应创建的线程数,N对应操作系统可以运行的实体.(N<M ...

  5. linux内核——进程,轻量级进程,线程,线程组

    1.进程.轻量级进程.线程.线程组之间的关系 2.及它们的标识相关说明 一.进程.轻量级进程.线程.线程组之间的关系 借助上图说明: 进程P0有四条执行流,即线程, 主线程t0是它的第一个线程,且与进 ...

  6. linux服务器开发二(系统编程)--线程相关

    线程概念 什么是线程 LWP:Light Weight Process,轻量级的进程,本质仍是进程(在Linux环境下). 进程:独立地址空间,拥有PCB. 线程:也有PCB,但没有独立的地址空间(共 ...

  7. 20155211 课下测试ch12补做

    20155211 课下测试ch12补做 有关线程图,下面说法正确的是() A.图的原点表示没有任何线程完成一条指令的初始状态 B.向右向上是合法的转换 C.向左向下是合法的转换 D.对角线是合法的转换 ...

  8. 补交课下测试(ch12并发编程) 08.第八周

    有关线程图,下面说法正确的是() A .图的原点表示没有任何线程完成一条指令的初始状态 B . 向右向上是合法的转换 C .向左向下是合法的转换 D .对角线是合法的转换 E .一个程序执行的历史被模 ...

  9. 20155332 补交ch12课下作业

    20155332 补交ch12课下作业 课下测试提交晚了,我课后补做了一遍,答对13题,答错3题. 试题内容如下所示: 课本内容 1.并发(Concurrency) 访问慢I/O设备:就像当应用程序等 ...

随机推荐

  1. 转--Eclipse中ctrl+shift+r与ctrl+shift+t的区别

    Eclipse中ctrl+shift+r与ctrl+shift+t的区别 标签: 快捷键工作区文件搜索打开资源文件 2016-09-13 15:44 292人阅读 评论(0) 收藏 举报  分类: e ...

  2. asp.net Routing 用法

    http://www.cnblogs.com/youring2/archive/2011/07/22/2113595.html asp.net 4.0中提供了Routing 的支持.通过使用routi ...

  3. Storm简介

    Storm特性 1. 低延迟和高性能 在一个小集群中,每个节点每秒可以处理数以百万计的消息. 2. 可扩展 在Storm集群中主要有三个实体:工作进程.线程和任务.Storm集群中每台机器上都可以运行 ...

  4. python学习-day03:整形、字符串常用方法:

    一.数字,int 1.1: a.int(object)转化数字类型: a=' b=int(a) b=b+1000 print(b) 223 <class 'int'> 答案 b.转化二进制 ...

  5. boost-asio-cpp-network-programming阅读笔记

    第二章:boost.asio 的基本原理 网络api boost.asio的命名空间 IP地址 端点 sockets 同步错误代码 socket成员函数 其他注意事项 read/write/conne ...

  6. Java事务处理全解析(六)—— 使用动态代理(Dynamic Proxy)完成事务

    在本系列的上一篇文章中,我们讲到了使用Template模式进行事务管理,这固然是一种很好的方法,但是不那么完美的地方在于我们依然需要在service层中编写和事务处理相关的代码,即我们需要在servi ...

  7. DOM节点的修改

    首先,我们将最后段落赋值给变量my: var my = document.getElementById('closer'); 接下来,我们就能够轻松地通过修改对象的innerHTML值来修改段落中的文 ...

  8. XE6移动开发环境搭建之IOS篇(9):配置XE6的IOS SDK(有图有真相)

    网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.开启PAServ ...

  9. eclipse 工程默认编码修改 JSP编码修改

    1. Window->Preferences->General->Workspace->Text file encoding 将其改为UFT-8  新建的文件即为UTF-8编码 ...

  10. C#GridViewExport帮助类,美化导出

    1.将整GridView的数据导出到Excel中关增加一个效果线做美化 最新的GridViewExport操作类 using System.Data; using System.Web; using ...