如何通过id获取线程对象?

How to get thread object by id?

本文关键字:对象 线程 获取 何通过 id      更新时间:2023-10-16

假设某个线程std::thread::id myId了其他线程。现在我想检索与myId关联的std::thread对象,以便我可以.join()它。在std可能吗?还是我必须手动跟踪它?

如果你能避免的话,我不建议这样做。即使在它可以工作的平台上,这也是一个糟糕的设计。我把它作为一种学术练习来满足好奇心。

AFIK没有标准的方法可以做到这一点。如果您不需要可移植性并且您真的想这样做......

在某些平台上(例如Mac,可能还有Linux),std::thread只是您已经拥有的底层pthread_t的包装器,因为它与您已经拥有的std::thread::id相同。换句话说,您可以将其转换为pthread_t并将其传递给pthread_join。与其关联的std::thread对象的行为与调用join()对象的行为相同。

示例程序(在 macOS 10.13 上测试):

auto t1 = std::thread([]() {
printf("Thread ran.n");
});
auto id = t1.get_id();
pthread_t* ptr = (pthread_t*)&id;
int ret = pthread_join(*ptr, nullptr);
if (ret == 0) {
printf("thread joined.n");
}
ret = pthread_join(*ptr, nullptr);
if (ret != 0) {
printf("error: %dn", ret);
}
try {
t1.join();
} catch (std::system_error& e) {
printf("%sn", e.what());
}

输出:

线程运行。

线程已连接。

错误:3

线程::连接失败:没有这样的进程

如您所见pthread_join()第一次调用时没有返回错误,表明线程确实已连接。第二次返回ESRCH,因为线程已经连接;与t1.join()相同。

请注意,如果构建实现只是检查pthread_t是否为 0,则t1.joinable()仍将返回 true。当std::thread超出范围时,它将被销毁而不会出错;使用Asan/Ubsan/Tsan运行时,我没有检测到任何错误;扬子晚报.