如何通过id获取线程对象?
How to get thread object by id?
假设某个线程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运行时,我没有检测到任何错误;扬子晚报.
相关文章:
- 即发即弃 std::线程对象清理自身
- C++:处理线程本地对象销毁
- 结束另一个线程中使用的对象的生存期
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 线程调用的函数对对象删除是否安全?
- 将对象传递给多线程对象 Qt
- asio 链对象线程安全吗?
- 如何初始化大线程本地对象?
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 当只有一个线程主要使用该对象而其他线程很少使用它时,如何最小化该对象的互斥锁锁定?
- 如何将对象从类线程传递到帖子?
- 将抽象对象从主线程发送到其他线程
- 在 While 循环中重用对象的多线程
- 本地静态函数对象线程安全的初始化
- 对于 c++11 之前的编译器,返回本地静态对象线程是否安全
- 从一个对象线程中使用 const 方法是否安全
- C++流对象线程安全
- 使STL对象线程安全的标准方法
- QT多线程和移动对象线程创建后