pthread_self() 和 gettid() 之间有什么区别?我应该使用哪一个?
- 2024-11-14 08:29:00
- admin 原创
- 25
问题描述:
我正在尝试在 Linux 上设置线程的 CPU 亲和性。我想知道推荐以下哪种方法:
使用 pthread_self() 获取线程 ID
使用 pthread_setaffinity_np(....) 通过将线程 ID 作为参数传递来设置 CPU 亲和性
使用 gettid() 调用获取线程 ID
使用 sched_setaffinity(....) 通过将线程 ID 传递到进程 ID 的位置来设置 CPU 亲和性
PS:设置完CPU亲和力之后,我打算提高线程的调度优先级。
解决方案 1:
它们并不相同。以下是我从TLPI收集的一些信息(我找不到足够大的块来完整描述这一点)。如果你很着急,你可能只需要最后一部分。
gettid
Linux 2.4 引入了一个新的系统调用,gettid()
以允许线程获取它自己的线程 ID。
线程组中的每个线程都由唯一的线程标识符区分。线程 ID 使用与进程 ID 相同的数据类型表示。线程 ID 在pid_t
系统范围内是唯一的,并且内核保证没有线程 ID 与系统上的任何进程 ID 相同,除非线程是进程的线程组负责人。
pthread_self
进程中的每个线程都由线程 ID 唯一标识。线程可以使用 获取自己的 ID pthread_self()
。
pthread_equal()
需要该函数来比较线程 ID,因为pthread_t
必须将数据类型视为不透明数据。
在 Linux 线程实现中,线程 ID 在进程间是唯一的。然而,在其他实现中情况并非如此,SUSv3 明确指出,应用程序不能可移植地使用线程 ID 来标识另一个进程中的线程。
gettid
对比pthread_self
POSIX 线程 ID 与 Linux 特定系统调用返回的线程 ID 不同gettid()
。POSIX 线程 ID 由线程实现分配和维护。返回的线程 IDgettid()
是一个由内核分配的数字(类似于进程 ID)。
我会继续,pthread_setaffinity_np
但请注意手册上说:
这些函数是在 sched_setaffinity(2) 之上实现的
解决方案 2:
我认为,它只gettid()
作为系统调用存在,而没有直接作为 API 调用公开,这可能意味着“只有当你绝对确定自己在做什么时才使用它”,并且gettid()
不是为了移植。
如果你坚持使用 ,效果会更好pthread
。你可以稍后使用以下方法更改调度策略/优先级:pthread_setschedparam()
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件