11.3 线程ID
正如每一个进程都有一个进程ID一样,每一个线程都有一个线程ID.与进程ID在系统内是唯一的不同,线程ID仅仅在其所属进程的上下文中有意义。
进程ID是使用数据类型pid_t来进行表示的,该类型是一个非负整数。线程ID使用pthread_t进行存储,实现可以使用一个结构来进行存储,所以可移植程序不能将他们当做整数对待,因此,对于线程ID的比较需要使用专门的函数实现:
#include <pthread.h>
int pthread_equal(pthread_t tid1, pthread_t tid2);
Returns:nonzero if equal,0 otherwise
Linux 3.2.0使用无符号长整数来存储pthread_t类型,Solaris 10使用无符号整数存储pthread_t类型。FreeBSD 8.0以及Mac OS X 10.6.8使用pthread指针来存储pthread_t类型。
采用结构来存储pthread_t数据类型来存储线程ID的一个问题是:没有可移植的方法来打印线程ID,有时候,在调试程序中打印线程ID是有效的,但是通常不需要这么做。最糟糕的情况就是,这回产生不可移植的调试代码,因此也就没有什么限制了。
线程可以通过函数pthread_self来获取到自身线程ID.
#include <pthread.h>
pthread_t pthread_self(void);
Returns: the thread ID of the calling thread.
该函数可以与函数pthread_equal一起使用,用于识别一个数据结构是否标识的是当前线程,比如说,一个主线程可能会将一个任务安排到一个队列中,并且使用线程ID来控制哪一个任务需要哪一个线程完成,这种情况阐述如图11.1所示:一个master thread将任务放到一个work queue中去。包含三个工作线程的线程池从队列中移除任务,然而并不是任意一个线程都可以处理位于任务队列头的任务,master thread已经为每一个作业都指派了一个特定的线程来进行处理。因此每一个作业线程仅仅会移除标记了自身线程ID的任务。