C++17是否有STL方法可以获取当前std::thread对象的指针?
问题解答
核心结论
C17(以及所有现行C标准版本)都没有提供能直接获取当前执行线程对应的std::thread对象指针的STL接口。
原因说明
std::thread的设计遵循「线程执行流与对象实例分离」的原则:同一个执行线程的所有权可以通过std::move在多个std::thread实例之间转移,执行线程本身和某个固定的std::thread对象没有永久绑定关系,标准无法定义要返回哪个实例的指针,因此不会提供这类接口。
替代实现方案
你原本的需求是判断当前执行线程是否属于当前MyThread实例,完全可以通过比对线程ID实现,改造后的代码逻辑更稳定,不受std::thread对象所有权转移的影响:
#include <thread> class MyThread { public: void startRoutine(MyThread* other){ // ... other->loop(); // ... // 原有判断线程是否可join的逻辑不变 if (other->_thread && other->_thread->joinable()) { other->_thread = nullptr; } } void loop() { // 线程执行流启动后第一时间存储当前线程ID _threadId = std::this_thread::get_id(); // 原有loop业务逻辑 // ... } bool isInsideCurrentThread() { // 直接比对线程ID即可实现原需求 return nullptr == _thread || std::this_thread::get_id() == _threadId; }; // ... private: std::thread* _thread; std::thread::id _threadId; // 新增存储线程ID的成员变量 };
注意事项
- 必须在对应线程的执行流内部(比如上述
loop函数开头)给_threadId赋值,不要在创建线程的外部线程中赋值,否则会错误存储创建者线程的ID。 - 线程ID是执行线程的全局唯一标识,只要线程还在运行就不会改变,比对逻辑不受
std::thread对象移动、重置等操作的影响,比原设计中比对std::thread指针的方案鲁棒性更强。
可选拓展方案(仅适用于特定场景)
如果你的业务逻辑保证一个执行线程只会绑定一个MyThread实例,也可以通过thread_local变量实现指针级别的比对,性能略高但通用性较差:
class MyThread { // ... inline static thread_local MyThread* current_bound_instance = nullptr; void loop() { current_bound_instance = this; // 原有loop业务逻辑 } bool isInsideCurrentThread() { return nullptr == _thread || current_bound_instance == this; } };
内容的提问来源于stack exchange,提问作者tai
相关产品推荐
相关产品推荐

