POSIX定时器timer_create()以及线程中的gettid() 和pthread_self()

时间:2022-05-27 23:30:11

POSIX定时器:


最强大的定时器接口来自POSIX时钟系列,其创建、初始化以及删除一个定时器的行动被分为三个不同的函数:
timer_create()(创建定时器)
timer_settime()(初始化定时器)
timer_delete(销毁它)

关于POSIX定时器,可参考这篇文章,写的很详细,在此不赘述。

下面是看论坛是发现的问题,记录在此了

linux多线程环境下gettid() pthread_self() 两个函数都获得线程ID
linux使用进程模拟线程,gettid 函数返回实际的进程ID,pthread_self 函数返回 pthread_create创建线程时的ID。

到底那个是线程的ID呢,一个线程不能有两个ID吧?

参考:
gettid是内核中的线程的ID, pthread_self是POSIX thread ID 。

线程库实际上由两部分组成:内核的线程支持+用户态的库支持(glibc),Linux在早期内核不支持线程的时候,glibc就在库中(用户态)以纤程(就是用户态线程)的方式支持多线程了,POSIX thread只要求了用户编程的调用接口对内核接口没有要求。linux上的线程实现就是在内核支持的基础上以POSIX thread的方式对外封装了接口,所以才会有两个ID的问题。

如果想编写 可移植的 多线程代码,代码可运行于 Solaris、FreeBSD、Linux 和其它平台,POSIX 线程是一种当然之选。

POSIX thread ID可以在一个进程内唯一标识一个线程,但如果放到系统范围内的话就得用gettid了。

其实 POSIX thread ID 是POSIX 标准的,所有遵循POSIX标准的系统都支持,gettid是linux独有的,

由于在Linux下POSIX thread 和系统thread是一对一的模型,所以可以认为一个gettid必然对应一个pthread id,但没有什么方法直接实现对两者的对应转换。

这篇文章:POSIX 线程详解,有助于理解线程的相关概念。