Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1800313
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

2012-03-31 22:16:59

正如每个进程有一个进程ID,每个线程也有一个线程ID。不像在系统唯一的进程ID,线程ID只在它所属的进程上下文里是有意义的。


回想下一个进程ID,由pid_t数据类型表示,是一个非负整数。一个线程ID由pthread_t数据类型表示。实现可以使用一个结构体来表示pthread_t数据类型,所以可移植的实现不能把它们当成是整型。因此,一个函数被用来比较两个线程ID。



  1. #include <pthreads.h>

  2. int pthread_equal(pthread_t tid1, pthread_t tid2);

  3. 相等返回非0,否则返回0.


Linux使用一个无符号长整型来表示pthread_t数据类型。Solaris用一个无符号整型表示。FreeBSD和Mac OS X用一个指向pthread结构体的指针表示。


允许pthread_t为一个结构体的一个后果是没有可移植的方法来打印它的值。有时,在程序调试时打印线程ID很重要,但是其它时候通常不需要这样做。最坏时,这导致不可移植的调试代码,所以它没有很多限制。



  1. 一个线程可以获得它自己的线程ID,通过调用pthread_self函数。

  2. #include <pthread.h>

  3. pthread_t thread_self(void);

  4. 返回调用线程的线程ID。


这 个函数可以和pthread_equal一起使用,当一个线程需要识别由它的线程ID标签的数据结构时。例如,一个主线程可以把工作分配放到一个队列里, 并使用线程ID来控制每个线程的工作。单个主线程把新的工作放到一个工作队列里。三个工作线程的线程池从队列删除工作。主线程通过在应该处理的每个工作里 放置线程ID来控制工作分配,而不是让每个线程处理任何在队列头的工作。每个工作线程然后只删除标签为它自己的线程ID的工程。

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