C 设置线程ID

C 设置线程ID,c,linux,gcc,x86,C,Linux,Gcc,X86,我希望能够设置自己的线程ID,例如,对于我在应用程序中创建的四个线程,我希望它们的ID为0、1、2和3。我知道可以使用线程局部变量并为其分配ID。但是,由于某些原因,我不能使用线程局部变量。您可以说,将线程ID作为参数传递给线程函数可以做到这一点,但在这种情况下,您需要在线程使用的每个函数中传递线程ID,这当然是不可行的 在谷歌上搜索一下,我发现了set_tid_address,它的名字看起来很有趣,但我不确定它是否能达到我的目的,因为它的文档不清楚。任何想法,如何实现这一点?PID是内核管理的

我希望能够设置自己的线程ID,例如,对于我在应用程序中创建的四个线程,我希望它们的ID为0、1、2和3。我知道可以使用线程局部变量并为其分配ID。但是,由于某些原因,我不能使用线程局部变量。您可以说,将线程ID作为参数传递给线程函数可以做到这一点,但在这种情况下,您需要在线程使用的每个函数中传递线程ID,这当然是不可行的


在谷歌上搜索一下,我发现了set_tid_address,它的名字看起来很有趣,但我不确定它是否能达到我的目的,因为它的文档不清楚。任何想法,如何实现这一点?

PID是内核管理的,在我的内核上使用pidmap_数组位图。或多或少,下一个PID将是最后一个增加1的PID(直到根据需要循环返回开始)。除了上面建议的私有重新映射之外,您对此无能为力

由于某些原因,我不能使用线程局部变量

找出原因,并消除它

否则,您正在练习。

可能的解决方案:

  • 将一个结构传递给您创建的每个线程(通常作为指针),然后让它们根据需要填写线程ID和其他属性-它还可以用于提供参数
  • 具有逻辑“线程编号”和“线程ID”之间的映射

  • 您无法控制线程ID;它们是由系统控制的。你不能将真实的线程id映射到你的私有线程id吗?设置线程id可能会使它与现有的线程id冲突,并会使调试它变得无穷无尽@约阿希姆,是的,这可能是一种方式。我已经考虑过了,但是我想要一种更直接的方法。将它传递给每个函数有什么不对?无论如何,您很可能需要将某种上下文结构传递给该线程中涉及的所有函数。特别是因为你不能使用线程局部变量。他可能意味着他不会使用线程局部变量,因为,例如,它们的可移植性不够。而且他建议使用的
    set_tid_address
    将更具可移植性?您唯一有限的影响——这显然不是您想要的——是更改系统上可分配的最大PID值(在2.6内核中,PID_MAX_默认值)。它通常位于/proc/sys/kernel/pid_max中。