代码之家  ›  专栏  ›  技术社区  ›  Skrud

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

  •  36
  • Skrud  · 技术社区  · 15 年前

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

    但是 …sched_setaffinity可以使用的线程ID是OS线程ID,您可以从 gettid() 系统调用。 这与不透明类型pthread不同 和gettid()将只返回 当前线程 . 我需要能够设置任意线程的CPU关联性。

    不幸的是,我无法访问pthread的私有部分,这会让我通过将pthread转换为 struct pthread * . 更好的是,我想,因为依赖私有实现甚至需要 更多 麻烦。

    我也一直在读 pthread_getunique_np 不过,这个函数返回一个“唯一的整数标识符”——我不认为它的形状或形式等同于OS线程ID。

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

    5 回复  |  直到 7 年前
        1
  •  32
  •   BD at Rivenhill    13 年前

    自从 pthread S不需要用Linux线程(或内核线程)来实现,而有些实现完全是用户级的或混合的,即 线程 S接口不提供访问这些实现细节的功能,因为这些细节不可移植(甚至跨 线程 在Linux上的实现)。使用这些的线程库可以将其作为扩展提供,但似乎没有这样做。

    除了访问线程库的内部数据结构(可以理解,您不希望这样做,尽管您假设处理器关联性和Linux线程ID,但您的代码无论如何都是不可移植的),如果您控制创建线程的代码,则可以在创建时玩一个把戏:

    给予 pthread_create() 一个调用 gettid() (顺便说一句,你可能需要使用 syscall 宏,因为它不总是由 libc ,将结果存储在某个地方,然后调用原始的entry函数。如果有多个线程具有相同的入口函数,则可以在 arg 论证 pthread_create ,然后将传递给您创建的用于存储线程ID的入口函数。存储 pthread_t 返回值 线程创建 按照相同的顺序,然后您就可以根据创建的所有线程的 邮戳 价值。

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

        2
  •  12
  •   nhahtdh Pankaj Wadhwa    11 年前

    事实上 pthread_self 收益率 pthread_t 而不是您可以使用的整数线程ID,下面的助手函数将以可移植的方式在不同的POSIX系统中获得它。

    uint64_t gettid() {
        pthread_t ptid = pthread_self();
        uint64_t threadId = 0;
        memcpy(&threadId, &ptid, std::min(sizeof(threadId), sizeof(ptid)));
        return threadId;
    }
    
        3
  •  1
  •   Kamil Zadora    15 年前

    我建议您使用一个共享的int数组进行一个简单的解决方案,在这个数组中,您可以从线程中写入线程ID,以便以后访问它。

    希望有帮助。

        4
  •  1
  •   Eric    11 年前
    pthread_t pthread_self()
    

    此返回当前pthread_t,即线程ID,您可以将其转换为类型“unsigned int”,

        5
  •  1
  •   Leonardo Alves Machado Vivek Kumar    7 年前

    GLYBC 2.24 这个 pthread_t 返回的只是指向不透明 struct pthread . 您可以在 nptl/descr.h .