我有一个pthread_t,我想更改它的CPU相关性.问题是我使用的是glibc 2.3.2,它没有pthread_setaffinity_np().不过这没关系,因为pthread_setaffinity_np()本身就是sched_setaffinity()的包装器,可以通过传递线程ID而不是进程ID来调用它,以设置任意线程的亲和性.

BUT ... sched_setaffinity可以使用的线程id是一个OS线程id,可以从gettid()系统调用中获得.This is different from the opaque type pthread_t,gettid()将只返回current thread的线程id.我需要能够设置任意线程的CPU亲和力.

不幸的是,我无法访问pthread的私有部分,这会让我通过将pthread_t转换为struct pthread *来窃取线程id.我想,这会更好,因为依赖私有实现甚至会带来more个麻烦.

我也读过pthread_getunique_np函数,但是它返回一个"唯一的整数标识符"——我认为它在任何形式上都不等同于OS线程id.

因此,问题是:如何从任意pthread_t获取线程ID?

推荐答案

由于pthreads不需要用Linux线程(或者内核线程)实现,而且有些实现完全是用户级的或混合的,所以pthreads接口不提供访问这些实现细节的函数,因为这些实现细节是不可移植的(即使在Linux上的pthreads实现中也是如此).使用这些线程库的线程库可以将其作为扩展提供,但似乎没有任何线程库可以这样做.

除了访问线程库的内部数据 struct (可以理解,您不希望访问线程库,尽管您假设处理器亲缘关系和Linux线程ID,但代码无论如何都不会是可移植的),如果您控制创建线程的代码,您可能能够在创建时玩一个小把戏:

pthread_create()一个调用gettid()的输入函数(顺便说一句,您可能必须直接使用syscall宏,因为libc并不总是导出它),将结果存储在某个地方,然后调用原始输入函数.如果有多个线程使用同一个entry函数,则可以将递增的指针传递到arg参数到pthread_create的数组中,然后将其传递给创建的entry函数,以在其中存储线程ID.以相同的顺序存储pthread_createpthread_t返回值,然后您将能够在给定pthread_t值的情况下查找您创建的所有线程的Linux线程ID.

这个技巧是否值得,取决于在您的情况下设置CPU相关性的重要性,而不是不访问线程库的内部 struct ,或者取决于提供pthread_setaffinity_np个线程的线程库.

Linux相关问答推荐

如何根据具体情况打印两行输出?

为什么Read()和cin.get()对输出缓冲区的影响不同?

shell中两个日期的天数差异

Linux TTY 操作顺序

为什么 liburing 写入性能低于预期?

使用 sed linux 命令和 i sed 命令进行 preprend 时的反向引用

使用 sed 从文本文件中删除特定字符串

如何在 Linux 上使用 -grep 构建过滤间隔的命令

我有 ext2 格式的文件系统图像.我喜欢在终端中读取 Linux 特别是 Ubuntu 中的所有文件系统 struct 数据.有没有工具>

如何将通配符参数传递给 bash 文件

Java 8 上的 SQL Server JDBC 错误:驱动程序无法使用安全套接字层 (SSL) 加密建立与 SQL Server 的安全连接

Linux C程序:如何找到函数所属的库

linux远程执行命令

在 64 位 Linux 操作系统上编译 32 位程序导致致命错误

如何分析内存使用情况?

使远程目录保持最新

仅使用 proc 获取本地网络接口地址?

比较文件的日期 bash

grep 递归查找 Linux 上的特定文件类型

如何查看线程在哪个 CPU 内核中运行?