当前位置: 首页 > 面试题库 >

如何从任意pthread_t获取线程ID?

微生运浩
2023-03-14
问题内容

我有一个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 *。我想,情况会更好,因为依靠私有实现会带来 更多 麻烦。

我也一直在阅读pthread_getunique_np函数,但是它返回一个“唯一整数标识符”-我不认为它的形式或形式等效于OS线程ID。

因此,出现了一个问题:如何从任意pthread_t获取线程ID?


问题答案:

由于pthreads不需要使用Linux线程(就此而言,根本不需要内核线程)来实现,并且某些实现完全是用户级别的或混合的,因此pthreads接口不提供访问这些实现细节的功能。不可移植(甚至跨pthreadLinux的各种实现)。使用那些线程库可以提供它作为扩展,但似乎没有任何作用。

除了访问线程库的内部数据结构(您不希望这样做,尽管假设您具有处理器亲缘关系和Linux线程ID,但您的代码无论如何都不能移植),您也许可以在创建时发挥作用,如果您控制创建线程的代码:

提供pthread_create()一个调用函数gettid()syscall由于您不一定总是通过导出宏,因此您可能必须直接使用该宏libc),将结果存储在某个位置,然后调用原始的输入函数。如果你有相同的入口函数的多个线程,你可以传递一个递增的指针到一个数组arg参数pthread_create,然后将传递到您创建的存储线程ID的入口函数,存放pthread_t的返回值pthread_create在相同的顺序,然后您将能够根据给定的pthread_t值查找创建的所有线程的Linux线程ID

此技巧是否值得,取决于您所设置的CPU亲和力的重要性,而不是不访问线程库的内部结构,或者取决于提供的线程库pthread_setaffinity_np



 类似资料:
  • 问题内容: 我有一个固定的线程池,我可以将任务提交给该线程池(限制为 5个 线程)。如何找出这 5个 线程中的哪一个执行我的任务(例如“第3 个 线程中的第3 个 线程正在执行此任务”)? 问题答案: 使用:

  • 本文向大家介绍在C#中如何从线程中获取线程ID,包括了在C#中如何从线程中获取线程ID的使用技巧和注意事项,需要的朋友参考一下 线程被定义为程序的执行路径。每个线程定义唯一的控制流。如果您的应用程序涉及复杂且耗时的操作,那么设置不同的执行路径或线程(每个线程执行一个特定的工作)通常会很有帮助。 线程是轻量级进程。使用线程的一个常见示例是现代操作系统对并发编程的实现。使用线程可以节省CPU周期,并提

  • 问题内容: 搜索过,但没有找到满意的答案。 我知道没有可移植的方式来打印pthread_t。 您如何在您的应用程序中做到这一点? 更新: 实际上,我不需要pthread_t,但是需要一些小的数字ID,以便在调试消息中标识不同的线程。 在我的系统(64位RHEL 5.3)上,它被定义为unsigned long int,因此它的数量很大,仅打印它就在调试行中占据了宝贵的位置。 gdb 如何 分配 短

  • 问题内容: 在大多数应用程序服务器上,J2EE Ejb规范禁止“手动”创建线程,因为这些资源应由服务器管理。 但是有什么方法可以从Tomcat,Glassfish,Jboss等获取线程;因此访问他们的ThreadPool? 问题答案: 您可以使用commonj WorkManager 。IBM和BEA提出了一项建议,以提供一种完成此任务的标准方法(访问容器管理的线程)。 尽管它没有包含在实际规范中

  • 问题内容: 您如何从字母char获得VK代码?看来您应该能够执行类似的操作,但这不起作用(结果为零)。如果您已经拥有一个KeyEvent,那么每个人都知道如何获取键码,但是如果您只是想将chars转换为VK int,该怎么办?我对获取奇怪字符的FK代码不感兴趣,只有[AZ],[az],[0-9]。 这个问题的背景--------我见过的所有机器人教程都假定程序员喜欢通过发送带有VK代码的按键来拼写

  • 问题内容: 下面的函数返回一个字符串。我如何获取从线程目标返回的值? 上面显示的“一种显而易见的方法”不起作用:。 问题答案: 我见过的一种方法是将可变对象(例如列表或字典)与索引或某种其他标识符一起传递给线程的构造函数。然后,线程可以将其结果存储在该对象的专用插槽中。例如: 如果你确实想join()返回被调用函数的返回值,则可以使用如下所示的Thread子类来实现: 由于名称修改,这有点麻烦,并