Chinaunix首页 | 论坛 | 博客
  • 博客访问: 131170
  • 博文数量: 18
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 174
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-30 10:35
文章分类

全部博文(18)

文章存档

2016年(1)

2015年(13)

2014年(4)

我的朋友

分类: LINUX

2014-11-09 22:13:45

文章转载于 />
       
Linux中,每个进程有一个pid,类型pidt_t,由getpid()取得。Linux下的POSIX线程也有一个id,类型pthread_t,由pthread_self()取得,该id由线程维护,其id空间是各个进程独立的(即不同进程中的线程可能有相同的id)。你可能知道,Linux中的POSIX线程库实现的线程其实也是一个进程(轻量级进程LWP),只是该进程与主进程(启动线程的进程)共享一些资源而已,比如代码段、数据段等。
     有时想我们肯呢个需要知道线程的真实pid,比如进程P1要向另外一个进程P2中的某个线程发送信号时,即不能使用P2的pid,更不能使用线程的thread id,而只能使用该线程的真实pid,称为tid。
     有一个函数gettid()可以得到tid,但glibc并没有实现该函数,只能通过Linux的系统调用syscall来获取。使用syscall得到tid只需一行代码,为加深印象,简单提供下面场景。
     有一簇进程,其中一个进程中另外启了一个线程。各进程共享一个数据结构,由shared_ptr指明,其中保存有线程的tid。在各个进程的执行过程中,需要判断线程是否存在,若不存在则重新创建。
     首先,在线程开始处,需要将自己的tid保存到共享内存,

点击(此处)折叠或打开

  1. #include <sys/syscall.h>
  2. #include <sys/types.h>
  3. void* thread_func(void *args)
  4. {
  5.     //~ lock shared memory
  6.     shared_ptr->tid = syscall(SYS_gettid); //~ gettid()
  7.     //~ unlock shared memory
  8.     //~ other stuff
  9. }
       在各进程中,判断线程是否存在

点击(此处)折叠或打开

  1. //~ lock shared memory
  2. pthread_t id;
  3. if (shared_ptr->tid == 0) { //~ tid is initialized to 0
  4.     pthread_create(&id, NULL, thread_func, NULL);
  5. } else if (shared_ptr->tid > 0) {
  6.     int ret = kill(shared_ptr->tid, 0); //~ send signal 0 to thread
  7.     if (ret != 0) { //~ thread already died
  8.         pthread_create(&id, NULL, thread_func, NULL);
  9.     }
  10. }
  11. //~ unlock shared memory

阅读(2149) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~