get linux thread id
来源:互联网 发布:中文版手机灰鸽子软件 编辑:程序博客网 时间:2024/05/16 20:27
first a thread program sample
#include <stdio.h>#include <pthread.h>#include <unistd.h>static int i = 0;void *threadfunc(void* pId){ int j = *(int*)pId; while(1){ printf("thread %d,%d\n", *(int*)pId,j++); sleep(1); if (j==8) j=j/(j-8); }}int main(){ int threadoneid = 1000; int threadtwoid = 10; int threeid = 100; //int i = 6/(7-j); pthread_t thread, thread2, thread3; pthread_create(&thread, NULL, threadfunc, &threadoneid); pthread_create(&thread2, NULL, threadfunc, &threadtwoid); pthread_create(&thread3, NULL, threadfunc, &threeid); pthread_exit(0); return 0;}
another
void * print_message_function( void *ptr ); main() { pthread_t thread1, thread2; char *message1 = "Hello"; char *message2 = "World"; pthread_create( &thread1, pthread_attr_default, print_message_function, (void*) message1); pthread_create(&thread2, pthread_attr_default, print_message_function, (void*) message2); exit(0); } void * print_message_function( void *ptr ) { char *message; message = (char *) ptr; printf("%s ", message); }
在linux2.4版本后,linux使用了NPTL作为自己的线程库,为了兼容POSIX标准,所以在内核task中有两个域tgid和tid,前者是进程id,后者是线程id。在linux上获得线程id的方法,目前我所知的有三种,当然这里的三种是指在用户态的程序中,否则除非自己写的kernel module, 都是调用编号224的系统调用实现的(2.6版本)。
第一种: gettid(), man gettid 可以看到gettid的使用方式。
使用时要先定义:_syscall0(pid_t, gettid)
其中_syscall0是一个宏(由于参数的不同还有_syscall1,_syscall2...),定义如下:
#define _syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \ //int 80, 软中断
: "=a" (__res) \ //输入输出都用的eax
: "0" (__NR_##name)); \ //#define __NR_gettid 224
__syscall_return(type,__res); \ //返回tid
}
编译时,宏展开之后,相当于定义了一个pid_t gettid(void)函数,用内嵌汇编实现,在程序中就可以使用gettid()获得线程id了。
第二种:syscall(), 名字叫syscall(),却是glibc中的库函数。
使用方式:syscall(__NR_gettid), 其中__NR_gettid就是224,同上。
syscall的实现要到glibc中去找,不同的硬件平台有不同的实现版本,在i386上的实现在syscall.S中:
#include <sysdep.h>
.text
ENTRY (syscall)
PUSHARGS_6 /* Save register contents. */
_DOARGS_6(44) /* Load arguments. */
movl 20(%esp), %eax /* Load syscall number into %eax. */
ENTER_KERNEL /* Do the system call. */
POPARGS_6 /* Restore register contents. */
cmpl $-4095, %eax /* Check %eax for error. */
jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */
L(pseudo_end):
ret /* Return to caller. */
PSEUDO_END (syscall)
其中ENTRY也是一个宏,展开了相当的长,主要用于在链接的时候让gcc能够"看见"并调用这段用汇编写成的syscall()函数。
第三种:pthread_self()
同样是一个glibc提供的函数,在linux的manual中说返回的是当前线程的thread ID.但是实际你看到的是一个很长的,似乎没有规律的值。什么原因得看看它的实现:
在glibc中,pthread_self()返回的是THREAD_SELF,这又是一个宏
定义如下
# define THREAD_SELF \
({ struct pthread *__self; \
asm ("movl %%gs:%c1,%0" : "=r" (__self) \
: "i" (offsetof (struct pthread, header.self))); \
__self;})
这段代码返回了当前线程的descriptor,pthread_self()得到的就是这个descriptor的地址, 也就是unsigned long int类型的pthread_t。知道了这一点就好办了,找到thread descriptor的定义:
struct pthread
{
...
pid_t tid;
...
}
接下来知道怎么做了吗?算好长度n,构造一个假的pthread结构。
struct pthread_fake
{
void *nothing[n];
pid_t tid;
};
用(struct pthread_fake *) pthread_self()->tid得到线程id了
相比前两种做法,这种无疑是最繁琐的,但是同理,可以获取很多glibc中维护了,但是没有提供访问方法的数据。
- get linux thread id
- get android process id and thread id
- How to get Android Thread ID?
- How to get current thread ID in asp.net
- Thread id
- Thread Id and Thread Handle
- gdb break line thread thread-id
- linux Thread
- Linux thread
- linux thread
- linux thread
- linux thread
- Thread+handler+GET 网络操作
- Get Process ID by Name
- CGAL get intersection primitive id
- get category id from product
- magento get paypal transaction id
- Linux ID
- HttpURLConnection IllegalStateException
- 沙迪克UTY编程基础操作流程
- Google Host Patch自动获取脚本
- 关于稳定婚姻问题
- java泛型
- get linux thread id
- Ubuntu 11.10 更新源地址列表及下载
- GIT 备忘(最常用)
- JQuery控制Select、Radio、Checkbox
- AF_INET 和 PF_INET的细微区别
- 在Centos下安装Firefox 4简单过程
- 关于飞思卡尔imx 53系列的adb的不能连接的问题
- cdoframework 2.0将于年底发布,届时新增分布式总线等重要功能
- boost.function源码剖析