我有一个 pthread_t,我想更改它的 CPU 关联性。问题是我使用的是 glibc 2.3.2,它没有pthread_setaffinity_np()。不过没关系,因为 pthread_setaffinity_np() 本身就是一个包装器sched_setaffinity(),可以通过传递线程 ID 而不是进程 ID 来调用它来设置任意线程的亲和性。
BUT... sched_setaffinity 可以使用的线程 ID 是操作系统线程 ID,您可以从gettid()系统调用。这与不透明类型 pthread_t 不同,而 gettid() 只会返回该线程的线程 ID当前线程。我需要能够设置任意线程的 CPU 关联性。
不幸的是,我无法访问 pthread 的私有部分,这会让我通过将 pthread_t 转换为 a 来窃取线程 idstruct pthread *
。我想,这样就更好了,因为依赖私有实现甚至需要more麻烦。
我也一直在阅读pthread_getunique_np函数,但是这会返回一个“唯一的整体标识符”——我不认为它在任何形式或形式上等同于操作系统线程 ID。
因此,问题是:如何从任意 pthread_t 获取线程 ID?
Since pthread
不需要使用 Linux 线程(或者根本是内核线程)来实现,并且某些实现完全是用户级的或混合的,pthread
s 接口不提供访问这些实现细节的函数,因为这些细节不可移植(即使跨pthread
Linux 上的实现)。使用这些的线程库可以提供它作为扩展,但似乎没有任何这样做。
除了访问线程库的内部数据结构(可以理解,您不希望这样做,尽管根据您对处理器关联性和 Linux 线程 ID 的假设,您的代码无论如何都不可移植),您也许可以在创建时玩点小把戏,如果您控制创建线程的代码:
Give pthread_create()
调用的入口函数gettid()
(顺便说一句,您可能必须使用syscall
直接宏,因为它并不总是由libc
),将结果存储在某处,然后调用原始入口函数。如果多个线程具有相同的入口函数,则可以将递增的指针传递到数组中arg
论证pthread_create
,然后它将被传递到您创建的用于存储线程 ID 的入口函数。存储pthread_t
返回值pthread_create
以相同的顺序,然后您将能够查找您创建的所有线程的 Linux 线程 ID(给定它们的值)pthread_t
value.
这个技巧是否值得,取决于在您的情况下设置 CPU 关联性的重要性,而不是访问线程库的内部结构,或者取决于提供的线程库pthread_setaffinity_np
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)