我有一个pthread_t,我想更改它的CPU关联性。问题是我使用的是glibc 2.3.2,它没有pthread_setaffinity_np()。没关系,因为pthread_setaffinity_np()本身是sched_setaffinity()的包装,可以通过传递线程ID而不是进程ID来调用它来设置任意线程的亲和力。
但是 … sched_setaffinity可以使用的线程ID是OS线程ID,您可以从gettid()系统调用中获得该类型。 这与不透明类型pthread_t不同 ,gettid()将仅返回 当前线程 的线程ID 。我需要能够设置任意线程的CPU相似性。
不幸的是,我无法访问pthread的私有部分,这会让我通过将pthread_t强制转换为来窃取线程ID struct pthread *。我想,情况会更好,因为依靠私有实现会带来 更多 麻烦。
struct pthread *
我也一直在阅读pthread_getunique_np函数,但是它返回一个“唯一整数标识符”-我不认为它的形式或形式等效于OS线程ID。
因此,出现了一个问题:如何从任意pthread_t获取线程ID?
由于pthreads不需要使用Linux线程(就此而言,根本不需要内核线程)来实现,并且某些实现完全是用户级别的或混合的,因此pthreads接口不提供访问这些实现细节的功能。不可移植(甚至跨pthreadLinux的各种实现)。使用那些线程库可以提供它作为扩展,但似乎没有任何作用。
pthread
除了访问线程库的内部数据结构(您不希望这样做,尽管假设您具有处理器亲缘关系和Linux线程ID,但您的代码无论如何都不能移植),您也许可以在创建时发挥作用,如果您控制创建线程的代码:
提供pthread_create()一个调用函数gettid()(syscall由于您不一定总是通过导出宏,因此您可能必须直接使用该宏libc),将结果存储在某个位置,然后调用原始的输入函数。如果你有相同的入口函数的多个线程,你可以传递一个递增的指针到一个数组arg参数pthread_create,然后将传递到您创建的存储线程ID的入口函数,存放pthread_t的返回值pthread_create在相同的顺序,然后您将能够根据给定的pthread_t值查找创建的所有线程的Linux线程ID 。
pthread_create()
gettid()
syscall
libc
arg
pthread_create
pthread_t
此技巧是否值得,取决于您所设置的CPU亲和力的重要性,而不是不访问线程库的内部结构,或者取决于提供的线程库pthread_setaffinity_np。
pthread_setaffinity_np